百木园-与人分享,
就是让自己快乐。

历史,JVM,JRE,JDK

历史

1990年,美国Sun公司的“Stealth计划”(后来改名为“Green计划”)目标设置在家用电器等小型系统的程序语言,准备应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信

1996年5月23日,JDK1.0开始发行(前期Java的版本只有两个)

2005年6月,Java One大会中,J2SE正式更名为JavaSE(其余二者也更名)

2009年4月20日,Oracle(甲骨文)公司以74亿美元价格收购Sun公司

注:

JavaSE开发和部署在桌面、服务器、嵌入式环境、实时环境;支持Javaweb服务开发的类;并为JavaEE,JavaME提供基础,其中包含Java的核心应用编程接口API(Application Programming Interface)

JavaEE开发和部署在服务器端Java应用程序;提供web服务、组件模型、管理和通信API;可以实现企业级的面向服务体系结构(SOA)、web2.0应用程序

JavaME为移动设备、嵌入式设备(手机、PDA、电视机顶盒、打印机)上运行的应用程序提供环境;其中包括用户界面、安全模型、内置的网络协议、对动态下载的连网和离线应用程序的丰富支持

JVM

包含Java编译器和Java解释器(Java解释器只是一个基于JVM平台的程序,所以它不能单独执行,必须依赖于JVM)

一、Java虚拟机,是软件模拟的计算机,JVM的机器码(部分常用的代码,电脑的CPU可直接解读的数据,即0(假)、1(真))保存在.class中

注:

字节码:与平台无关的二进制码,不面向特定的处理器,只面向虚拟机

字节码文件:Java源代码经过编译器编译后产生的文件(扩展名为.class的文件)

  在一定程度上解决了解释性语言执行效率低的问题,保留了解释性语言可移植的特点

  Java程序运行高效的原因(可以在任何具有JVM的计算机或者电子设备上运行,且不同的平台有适合自己平台的虚拟机,即“一次编译,多次运行”)

二、Java解释器负责将字节码解释为机器码进行运行

1.编译与解释并存的解释(Java的特点):

  • Java源文件经过Java编译器(Javac.exe)编译以后形成JVM可运行的字节码(.class)文件
  • 运行Java解释器(Java.exe)即可将JVM上运行的目标代码(字节码,即.class文件)解释成为具体平台的机器码,也就可以运行该Java程序
  • 由以上可知,任何一台机器只要配备了Java解释器,就可以跨平台运行这个程序,不管这种字节码是在何种平台上生成的

2.  .Java(源文件)---编译--->.class(字节码文件)

(1)、代码执行先后顺序:

  • 父类的静态变量和静态块赋值(按照声明顺序)
  • 自身的静态变量和静态块赋值(按照声明顺序)
  • main方法
  • 父类的成员变量和块赋值(按照声明顺序)
  • 父类构造器赋值
  • 自身成员变量和块赋值(按照声明顺序)
  • 自身构造器赋值
  • 静态方法,实例方法只有在调用的时候才会去执行

(2)、静态方法,实例方法只有在调用的时候才会去执行

(3)、当静态加载中遇到需要加载非静态的情况: 先加载非静态再加载静态(因为非静态可以访问静态,而静态不能访问非静态)

(4)、静态代码块不能存在任何方法体中

(5)、静态代码块在类加载的时候就要运行

(6)、静态代码块不能访问普通变量

(7)、普通变量只能通过对象来调用,是不能放在静态代码块中的

(8)、普通方法是通过加载类,然后new出实例化对象;通过对象运行这个方法

(9)、在类加载的时候,静态方法也已经加载了;但必须要通过类名或者对象名才能访问(相比于静态代码块,静态代码块是主动运行的,而静态方法是被动运行的)

三、代码安全性检查机制

1.加载代码:类加载器

2.检查代码:字节码检验器:4遍检查后未出现报错后保护

  • 类符合JVM规范的类文件格式
  • 无访问限制违例
  • 代码未引起操作栈上溢或下溢
  • 所有操作代码的参数类型将总是正确
  • 无非法数据转换发生
  • 对象域访问是合法的

3.执行代码:运行时的解释器(采用沙箱模式:Java程序的的代码和数据都限制在一定内存空间里执行,不允许程序访问该内存外的内存;(Applet程序:还不允许程序访问客户端机器的文件系统)

JRE

JRE(Java Runtime Environment,即Java运行环境),是运行JAVA程序所必须的环境的集合,包含JVM标准实现、Java核心类库(API)及支持文件,但不包含开发工具(编译器、调试器等)

JDK

JDK(Java Development Kit) 是Java 程序开发的工具包,即Java的SDK(Software Development Kit)

JavaSDK:中文意思是“软件开发包”,是厂商提供的集成封装的库(library)

辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”

可以认为JDK只是SDK的一种(子集),因为JDK是开发Java程序的一个平台,开发其他程序的SDK可以没有JDK(如下载了一个软件开发平台 eclipse-SDK-3.2.2-win32.zip,它本身里面是没有JDK的,但是只要开发Java程序就必须使用JDK)

JDK 是整个Java的核心,包括了Java的开发环境和运行环境(Java Runtime Envirnment)以及一堆Java工具(tools.jar)和Java基础的类库(rt.jar) 等

JDK=开发工具 +JRE=API(核心类库)+JVM

一、.官网下载地址:Java Downloads | Oracle

注:

JDK和JRE不能放在同一个目录下(JDK中含有JRE)

安装JDK会自动安装专属JRE,所以不需要额外安装独立JRE(即取消“公共JRE”),同时不需要单独安装独立JRE

二、安装后的目录结构:

1、JDK和JER

(1)区别:JDK是开发工具包,用来开发Java程序,是面对Java的程序开发人员;JRE是是运行环境,面向的是Java程序的使用者(也就是说,要使用Java开发程序,则必须安装JDK,只想运行Java程序,那只需安装JRE

(2)联系:参考Java源文件的编译和执行过程

2、JDK安装目录及其子目录分析

(1)、如:JDK根目录为:C:\\Program Files\\java\\jdk1.6.0_16(下面以Jdk代替)

介绍相关目录:

  • jdk:jdk根目录,包含版权、许可及 README 文件以及Java核心平台API的源文件归档(src.zip)
  • ---Jdk\\bin:jdk开发工具可执行文件目录,里面包含有Javac.exe(编译器)、Java.exe等可执行程序
  • ---Jdk\\lib:jdk开发工具使用的类库目录,主要包括tools.Jar和dt.Jar
  • ---Jdk\\Jre:jdk开发工具所使用的Java运行时环境的根目录,除了文档外,它与可部署的JRE完全相同
  • ---Jdk\\demo:jdk自带的一些例子,含有源代码的程序示例
  • ---Jdk\\include:c的头文件,用与支持native-code库使用jvm Debugger接口 
  • ---Jdk\\src.zip:jdk所提供的的类库的源代码文件

注:tar.exe(打包器)

(2)、jdk\\jre\\下的一些子目录:

  •  jdk\\jre\\:Java运行环境存放目录
  • ---jdk\\jre\\bin:jre执行文件及DLL库,可执行文件与jdk\\bin相同,不必将该目录放在PATH环境变量中
  • ---jdk\\jre\\bin\\client:Java client VM and DLL
  • ---jdk\\jre\\bin\\server:Java servlet VM and DLL
  • ---jdk\\jre\\lib: Java程序运行时环境使用的代码库、属性设置和资源文件,主要包括:
  •   * rt.jar:系统引导库(构成Java平台核心API的RunTime 类)
  •   * charsets.jar:字符转换类及其它与国际化和本地化有关的类
  • ---jdk\\jre\\lib\\ext:Java平台扩展类库的缺省安装目录。例如JavaHelp jar 就可以放在此目录下
  • ---jdk\\jre\\lib\\security:包含用于安全管理的文件。这些文件包括安全策略 (Java.policy) 和安全属性 (Java.security) 文件
  • ---jdk\\jre\\lib\\applet:对applet支持的一些资源文件
  • ---jdk\\jre\\lib\\fonts:TrueType 字体文件

3、Java目录中存在两个Jre目录以及三个lib目录

(1)、两个Jre目录,分别为:

  • C:\\Program Files\\Java\\jre6:可部署的JRE,执行Java程序
  • C:\\Program Files\\Java\\jdk1.6.0_16\\jre:jdk中自带并使用的JRE,开发Java程序

总体来说,两个JRE文件夹内容基本相同,区别主要体现在工作职责上,也就是不同的JRE负责不同的工作范围

如:使用Javac.exe来编译Java程序时,系统会优先使用jdk\\bin下的可执行文件,使用的运行环境也是jdk下的Jre

(2)、三个lib目录,分别为:

  • C:\\Program Files\\Java\\jre6\\lib:jre下的,只是运行Java程序的jar包,是为JVM运行时候用的,包括所有的标准类库和扩展类等
  • C:\\Program Files\\Java\\jdk1.6.0_16\\lib:jdk下的,包括Java开发环境的jar包,是给JDK用的,例如JDK下有一些工具,可能要用该目录中的文件。比如编译器等
  • C:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib:jdk\\jre下的,是开发环境中运行时需要的Jar包。最典型的是导入的外部驱动Jar包。因为编译时,系统找的是Jdk下的Jre,而不是最外层的Jre

三、环境配置:

1.设置——高级系统设置——环境变量——系统变量

(1)path

配置作用:

  • 让系统在Path中自动找到Javac.exe文件,将编写好的.Java文件进行编译
  • 方便在自定义的代码文件夹路径(.Java文件所在路径)下使用“Javac  *.Java”命令(将.Java文件编译成.class文件)
  •   Javac.exe文件放置在jdk\\bin文件夹内
  • 当我们要运行Java程序时,需要编译(使用Javac.exe)和执行(使用Java.exe),系统默认的是在当前程序所在的文件夹目录下去寻找这两个执行文件,不会去其他地方找
  •   此时就需要配置Path环境变量,使每次程序运行自动到安装JDK的bin目录下去搜索Javac.exe和Java.exe文件

注:

JDK装好后的两个重要执行文件Javac.exe(代码编译文件)和Java.exe(代码执行文件)存在于所装的JDK的bin目录下,而我们写的Java或者跑别人的程序一般是放在一个新的目录,主要是方便管理,如果都放在这里,会很混乱,而且编译还有class文件生成

在DOS命令行(“win+R”,输入“cmd”进入)输入相关应用程序名字,系统会自动在当前路径和Path路径中去寻找与之对应的.exe和.bat文件

  找不到会报错“*不是内部或外部命令,也不是可运行的程序或批处理文件。”

变量值:

  • Windows
  •   将安装的jdk\\bin文件夹配置在Path中
  • Linux,UNIX,Solaris,FreeBSD
  •   环境变量PATH设定为指向Java二进制文件安装的位置(设置遇到困难,请参考shell文档)
  • 如:使用bash作为shell,把下面的内容添加到 .bashrc文件结尾: export PATH=/path/to/Java:$PATH
  • 找到最开始介绍的Javac.exe和Java.exe所在的目录复制到这里即可

(2)classpath

  • 不配置时默认是当前文件夹,配置的方式不同,产生的效果不同
  • 变量值:
  • 1.          E:\\nihao           : 虚拟机在E:\\nihao目录下寻找.class文件,找不到报错;
  • 2.          E:\\nihao;           :虚拟机先寻找E:\\nihao路径下的.class文件,找到就运行,找不到就找当前所在的路径;
  • 3.          .;E:\\nihao           :虚拟机先寻找当前所在的路径下的.class文件,找到就运行,找不到找E:\\nihao路径下的.class文件
  • 使用1.5以上版本的JDK,不用设置CLASSPATH环境变量,也可以正常编译和运行Java程序
  • 赋值的路径有三个,以分号为间隔隔开
  • 第一个英文的句号表示当前目录路径
  • 第二个目录为lib库中的tools工具包路径
  • 第三个为lib库中的dt包路径
  • 因为有时候会自己编写一些包或类,所以把第一个当前路径加上最好,以免以后出错难找bug
  • classpath(CLASSPATH)路径是Java虚拟机(JVM)调用.class文件时寻找的路径
  • CLASSPATH顾名思义为包路径,即告诉Java在执行的时候,去哪里找到需要的包和类供程序使用,所以配置时应把包的路径赋值给CLASSPATH

(3)JAVA_HOME:

  • JDK安装路径
  • 有一些基于 Java 开发的工具会用到JDK的路径,比如 tomcat,eclipse,所以配置JDK的路径给JAVA_HOME

3.安装后查询

  • Java -version:JDK版本号
  • Javac:Java语言编程编译器,path配置
  • Java

4.使用DOS运行Java代码

  • Javac---空格---HelloWorld.Java
  •   源程序文件所在目录会产生一个HelloWorld.class的字节码文件,这是编译后的文件
  • Java---空格---HelloWorld
  • 遇到编码问题,使用 -encoding 选项设置 utf-8 来编译:
  •   Javac -encoding UTF-8 HelloWorld.Java 

四、版本

1.Oracle JDK版本,三年一发,并不是完全开源的,不会为即将发布的版本提供长期支持,用户每次都要通过更新到最新版本获得支持来获取最新版本

  据二进制代码许可协议获得许可,更稳定,有更多的类和一些错误修复,在响应性和JVM性能方面更好

2.Open JDK版本,三个月一发,完全开源,是一个参考模型

  据GPL v2许可获得许可


来源:https://www.cnblogs.com/yuyingli/p/16009847.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 历史,JVM,JRE,JDK

相关推荐

  • 暂无文章