现在,让我们详细讨论JVM体系结构的每个组件。它由各种组件组成,我们将从classloader子系统开始。
JVM的类加载器子系统
Classloader是JVM的子系统。类加载器用于加载类文件。它使用字节码验证程序验证类文件。只有有效的类文件才会被加载。
JVM的运行时数据区域
方法区
方法区域也称为类区域。方法区域存储每个类的数据,如字段,常量池以及方法数据和信息。
堆
堆是所有对象存储在JVM中的位置。堆甚至包含数组,因为数组是对象。
Java线程(Java线程堆栈)
您必须知道每个线程都有自己的堆栈。线程调用新方法时如何创建堆栈帧?我们知道,每个线程都有自己的堆栈。每当调用一个新方法时,都会创建一个新的堆栈帧,并将其推送到该线程堆栈的顶部。
线程堆栈包含什么?它们具有所有局部变量,所有参数和所有返回地址。堆栈从不存储对象,但它们存储对象引用。
程序计数器寄存器(PC寄存器)
程序计数器寄存器包含当前正在执行的指令的地址和下一条指令的地址。
本机内部线程(本机线程堆栈)
本机内部线程包含与本机平台相关的所有信息。例如,如果我们在Windows上运行JVM,它将包含与Windows相关的信息。同样,如果我们在Linux上运行,它将拥有我们需要的所有与Linux相关的信息。
执行引擎
执行引擎包含JIT(即时)编译器和垃圾收集器编译器,以及解释器
JIT C ompiler
JIT编译器在运行时将字节码编译为机器代码,并提高Java应用程序的性能。
当然,JIT编译确实需要处理器时间和内存使用。当JVM首次启动时,会调用许多方法。编译所有这些方法可能会显着影响启动时间,尽管程序最终可能会获得良好的性能。
第一次调用方法时不编译方法。对于每个方法,JVM都维护一个调用计数,每次调用该方法时都会递增。这些方法由JVM解释,直到调用计数超过JIT编译阈值(JIT编译阈值提高了性能并帮助JVM快速启动.Java开发人员已经仔细选择了阈值以获得最佳性能。启动时间和启动时间之间的平衡。保持长期表现)。
因此,一旦JVM启动,就会编译非常频繁使用的方法,并且稍后编译不常使用的方法。
编译方法后,其调用计数重置为零,随后对该方法的调用会增加其调用计数。当方法的调用计数达到JIT重新编译阈值时,JIT编译器第二次编译方法,与先前编译中应用的优化相比,应用更多优化。重复此过程,直到达到最大优化级别。始终优化最常用的方法,以最大限度地提高使用JIT编译器的性能优势。
假设JIT重新编译阈值= 2。
编译方法后,其调用计数重置为零,随后对该方法的调用会增加其调用计数。当方法的调用计数达到2(即JIT重新编译阈值)时,JIT编译器第二次编译该方法,应用更多优化。
垃圾收集器
垃圾收集是JVM清除堆中的对象(未使用的对象)以回收堆空间的过程。
翻译员
解释器负责读取字节码然后执行指令。
JVM的本机方法库
本机方法接口是一个接口,它将JVM与本机方法库连接起来,以执行本机方法。
如果我们在Windows上运行JVM(Java应用程序),那么本机方法接口(Windows方法接口)将连接JVM和Window方法库(本机方法库)以执行Windows方法(本机方法)。
您可以纯粹使用Java编写应用程序,但在某些情况下,单独的Java代码可能无法满足您的要求。当应用程序不能完全用Java编写时,程序员使用JNI编写Java本机方法。
在这里阅读有关JNI的更多信息 。
与性能相关的最重要的JVM组件是:
1,堆
2,JIT(及时)编译器
3,垃圾收集器
三个组件(堆,JIT(即时)编译器和垃圾收集器)与JVM的性能调整相关。
所有对象都存储在堆中,垃圾收集器在JVM初始化时管理堆。
有许多VM(JVM)选项:
1,增加和减少堆大小以管理对象以获得最佳性能。
2,根据您的要求选择不同的垃圾收集器。
同时,对于JIT Compiler JIT:
1,JIT编译器在运行时将字节码编译为机器代码,并提高Java应用程序的性能。
2,对于较新版本的JVM,很少需要JIT编译器调优。
Java平台如何成为一种独立语言?
一旦在一个平台上编译源代码(即.java文件)(形成字节码),就可以在运行JVM的任何其他平台上执行(解释)该字节码。
每个平台都有不同的JVM实现。例如,Windows的JVM与Linux的JVM不同。