JDK, JRE and JVM
JDK, JRE and JVM
JDK(Java development kit)
JDK是用于Java开发的一套工具包,里面包含了Java的编译器javac、Java程序打包工具jar、Java程序运行环境JRE、文档生成工具javadoc以及很多用于开发的工具,如调试工具jdb等。
JDK是用于java程序的开发。
JRE(Java runtime environment)
JRE是运行Java程序所需的环境,包括JVM以及Java类库等。JRE是Java程序运行的实施场所,同时也提供了运行Java程序所必需的库文件。JRE只能运行class而没有编译的功能。
JVM(Java Virtual Machine)
Java虚拟机。JVM是Java运行环境的核心,它负责Java程序的运行。JVM是一个虚拟的计算机,它接收到字节码(编译后的Java程序),然后解释或编译执行。
JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
.java处理过程
编译为字节码
首先将Java源代码编译成字节码,这种字节码与平台无关,存储在.class
文件中(这个编译器不依赖JVM,而是一个独立的编译器,负责将高级的Java语言转换为低级的字节码)。
JVM执行字节码
JVM可以逐行解释执行字节码,将其翻译为机器指令来运行。这种方法在早期的JVM实现中使用较多,但性能相对较低,因为每条字节码在运行时都需要动态解释。
现代的JVM大多使用JIT编译。JIT会在程序运行时将字节码批量转换为机器码,并将其缓存下来,以便在后续执行时不再需要重新解释。这样,程序可以以接近本地代码的速度运行。
JIT不仅仅是简单的编译,还会根据程序的实际运行情况进行动态优化。比如,它会监测哪些方法调用频繁,然后将这些“热点代码”进行优化编译。
JVM通常会在程序开始时解释执行,**随着程序运行,它会逐渐将常用部分编译为机器码。**这样可以平衡启动时间和执行效率。
JVM不同于简单的编译器,C++纯编译,导致程序如果短可能编译时间会长,python纯解释,如果程序长就会慢;JVM混合着来,综合它们的优点,前期解释,编译最常用的代码,做到最快。