Java虚拟机(JVM),JDK,JRE和JVM的区别
作者:CHAITANYA SINGH
来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=4
Java是一种高级编程语言。用高级语言编写的程序不能直接在任何机器上运行。首先,它需要被翻译成特定的机器语言,javac编译器做的就是这件事情,它读取Java程序(存有源代码的.java文件)并将其转换成机器代码(称为字节码或.class文件)。
Java虚拟机(JVM)是驻留在真实机器(您的计算机)中的虚拟机,JVM的机器语言是字节代码,这就使编译器的工作更容易了,因为它只须为JVM生成字节代码,而不是为每种类型的机器生成不同的机器代码。JVM虚拟机运行编译器生成的字节代码并输出结果,所以有了JVM才使java语言成为跨平台的语言。
所以,现在我们知道JVM的主要功能是执行编译器生成的字节代码。每个操作系统都有不同的JVM,但是在执行字节代码后它们产生的输出在所有操作系统中都是相同的。这意味着在Windows上生成的字节代码可以在Mac OS上运行,反之亦然。这就是我们将java称为跨平台语言的原因。同样的事情可以在下图中看到:
总结: Java虚拟机(JVM)是在物理机器(您的计算机)上运行并执行Java字节代码的虚拟机。JVM读不懂Java源代码,这就是为什么我们需要使用javac编译器来编译* .java文件以获取包含JVM能读懂的字节代码的* .class文件。JVM使java代码具备了可移植性(一次编写,随处运行)。每个操作系统都有不同的JVM,但是在执行字节代码后它们产生的输出在所有操作系统中都是相同的。
JVM架构
让我们看看JVM是如何工作的:
类加载器(Class Loader):类加载器读取.class文件并将字节代码保存在方法区域中。
方法区域(Method area):JVM中只有一个方法区域在所有类之间共享,这个区域保存了每个.class文件的类级别信息。
堆(Heap):堆是JVM内存中分配给对象用的那部分内存。JVM为每个.class文件创建一个Class对象。
栈(Stack):栈也是JVM内存的一部分,但与堆(Heap)不同,它用于存储临时变量。
PC寄存器(PC Registers):主要用于跟踪已执行的指令以及将要执行的指令。由于指令由线程执行,因此每个线程都有一个单独的PC寄存器。
本地方法堆栈(Native Method stack):本地方法可以访问虚拟机的运行时数据区域。
本地方法接口(Native Method interface):它使java代码能够被本机应用程序调用或调用。本机应用程序是特定于系统的硬件和操作系统而设计和编写的程序。
垃圾收集(Garbage collection):由java代码显式创建的类的实例,在使用完毕后,它会被垃圾收集器自动销毁以进行内存管理。
JVM与JRE和JDK的对比
JRE:JRE是java虚拟机运行的环境。JRE包含Java虚拟机(JVM),类库和其他文件,但不包括编译器和调试器等开发工具。
这意味着您可以在JRE中运行代码,但无法在JRE中开发和编译代码。
JVM:如上所述,JVM通过使用JRE提供的类,库和文件来运行程序。
JDK:JDK是JRE的超集(Superset),它包含JRE与开发工具(如编译器,调试器等)的所有内容。