Java基础知识 ——JDK,JRE和JVM
1.开发简单的Java程序过程:
名词解释:
JDK:JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。没有JDK的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。
JDK包含的基本组件包括:
javac – 编译器,将源程序转成字节码
jar – 打包工具,将相关的类文件打包成一个文件
javadoc – 文档生成器,从源码注释中提取文档
jdb – debugger,查错工具
java – 运行编译后的java程序(.class后缀的)
appletviewer – 小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
Javah – 产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
Javap – Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
Jconsole – Java进行系统调试和监控的工具
JDK包含的Java系统类库:
java.lang: 这个是系统的基础类,比如String等都是这里面的,这个包是唯一一个可以不用引入(import)就可以使用的包。
java.io: 这里面是所有输入输出有关的类,比如文件操作等。
java.nio:为了完善io包中的功能,提高io包中性能而写的一个新包 ,例如NIO非堵塞应用
java.net: 这里面是与网络有关的类,比如URL,URLConnection等。
java.util: 这个是系统辅助类,特别是集合类Collection,List,Map等。
java.sql: 这个是数据库操作的类,Connection, Statement,ResultSet等。
javax.servlet:这个是JSP,Servlet等使用到的类。
JDK的目录结构:
当你打开安装的jdk目录之后会看到如下的目录结构:
拓展部分:
关于一下各个文件夹的内容和作用我来给大家介绍一下:
(请注意:此时默认的目录是没有上图中的src文件夹的,该文件夹是我把src.zip解压生成的,这个压缩包比较特殊,其实里面的内容就是java基本类库的源代码,全部都是.java文件,大家没事可以看看其中的源代码,了解下java类的设计)
-bin目录: JDK开发工具的可执行文件
-lib目录: 开发工具使用的归档包文件
-jre: Java 运行时环境的根目录,包含Java虚拟机,运行时的类包和Java应用启动器,但不包含开发环境中的开发工具
-demo: 含有源代码的程序示例
-include: 包含C语言头文件,支持Java本地接口与Java虚拟机调试程序接口的本地编程技术
其中我要强调jre\lib和jdk\lib的区别:
jre\lib 下面的是执行Java程序所需的类库(包括Java核心类,swing,rmi),而jdk\lib 下面的是用来支持jdk\bin下面的开发工具的非核心类库tool.jar,以及还有dt.jar包含了BianInfo文件用来与IDE交互,显示定制javabean组件外观的。
简单的说,如果只是运行Java程序,就不需要jdk\lib下的jar文件,如果要用jdk等开发,特别是用到Javabean,和某些jdk工具就要用到jdk\lib下的类库文件;
java的API文档是对jre\lib\rt.jar的说明,也就是说与前文java类库的源码也就是src.zip文件里面的.java文件形成一一对应关系的就是jre\lib目录下rt.jar里面的.class文件。
还有一点需要说明就是我们平时写java程序,import的java的自带的类,其实最后都是相当于引用的.class文件,与.java文件并没有什么关系,所以src文件夹默认是没有的。
JRE:JRE是Java Runtime Environment缩写,指Java运行环境,是Sun的产品。运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库和支持文件。它不包含开发工具(JDK)--编译器、调试器和其它工具。JRE需要辅助软件--Java Plug-in--以便在浏览器中运行applet。
Java Plug-in软件允许Java Applet和JavaBean组件在使用Sun的Java Runtime Environment(JRE)的浏览器中运行,而不是在使用缺省的Java运行环境的浏览器中运行。Java Plug-in可用于Netscape Navigator和Microsoft Internet Explorer。
(注:如果你只需要运行Java程序或Applet,下载并安装它即可。如果你要自行开发 Java软件,请下载JDK,在JDK中附带有JRE。)
JVM:JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,是整个java实现跨平台的最核心的部分。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。
Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的字节码(即Java程序被编译为.class的类文件),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行(也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行)。这就是Java的能够"一次编译,到处运行"的原因。
但只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
注:几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。
JVM定义了控制Java代码解释执行和具体实现的五种规格,它们是:
- JVM指令系统
- JVM寄存器
- JVM 栈结构
- JVM 碎片回收堆
- JVM 存储区
2.JDK、JRE、JVM三者间的关系
金字塔结构 JDK=JRE+JVM+其它 运行Java程序一般都要求用户的电脑安装JRE环境(Java Runtime Environment);没有jre,java程序无法运行;而没有java程序,jre就没有用武之地。
3.JDK和JRE的区别
JRE主要包含:java类库的class文件(都在lib目录下打包成了jar)和虚拟机(jvm.dll);JDK主要包含:java类库的 class文件(都在lib目录下打包成了jar)并自带一个JRE。那么为什么JDK要自带一个JRE呢?而且jdk/jre/bin下的client 和server两个文件夹下都包含jvm.dll(说明JDK自带的JRE有两个虚拟机)。
记得在环境变量path中设置jdk/bin路径吗?
老师会告诉大家不设置的话javac和java是用不了的。确实jdk/bin目录下包含了所有的命令。可是有没有人想过我们用的java命令并不是jdk/bin目录下的而是jre/bin目录下的呢?不信可以做一个实验,大家可以把jdk/bin目录下的java.exe剪切到别的地方再运行java程序,发现了什么?一切OK!(JRE中没有javac命令,原因很简单,它不是开发环境)那么有人会问了?我明明没有设置jre/bin目录到环境变量中啊?试想一下如果java为了提供给大多数人使用,他们是不需要jdk做开发的,只需要jre能让java程序跑起来就可以了,那么每个客户还需要手动去设置环境变量多麻烦啊?所以安装jre的时候安装程序自动帮你把jre的 java.exe添加到了系统变量中,验证的方法很简单,去Windows/system32下面去看看吧,发现了什么?有一个java.exe。
难点:
如果安装了JDK,你的电脑就有两套JRE(JRE本身和JDK中的JRE),前面这套比后面那套少了Server端的Java虚拟机。
♦为什么Sun要让JDK安装两套相同的JRE?
这是因为JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe等),而且都放置在/lib/tools.jar里。如果我们将tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结果:Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac/Main。这个意思是说,你输入javac.exe与输入java -cp c:/jdk/lib/tools.jar com.sun.tools.javac.Main 是一样的,会得到相同的结果。从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。而且可以发现/lib目录下的程序都很小,不大于29K,从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程序,也必须要自行附一套JRE才行,所以位于JDK目录下的那套JRE就是用来运行一般Java程序的。
♦如果一台电脑安装两套以上的JRE,谁来决定呢?
这个重大任务就落在java.exe身上。java.exe的工作就是找到合适的JRE来运 行Java程序。java.exe依照以下的顺序来查找JRE:
1)自己的目录下有没有JRE;
2)父目录有没有JRE;
3)查询注册表:[HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment]
所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。
♦JDK-->JRE-->Bin目录下有两个文件夹:server与client,这是真正的jvm.dll所在。 jvm.dll无法单独工作,当jvm.dll启动后,会使用explicit的方法(就是使用Win32 API之中的LoadLibrary()与GetProcAddress()来载入辅助用的动态链接库),而这些辅助用的动态链接库(.dll)都必须位于jvm.dll所在目录的父目录之中。因此想使用哪个JVM,只需要设置PATH,指向JRE所在目录下的jvm.dll。
♦最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。
(详细内容参考资料来源:https://blog.csdn.net/QingKing520/article/details/52893763 、https://blog.csdn.net/littleyearyear/article/details/41477807、https://www.cnblogs.com/bolang100/p/6929514.html)