HotSpot:性能秘密大揭秘(二)
2023-12-27 03:53:43
HotSpot算法细节(二)
HotSpot是一款成熟的、高性能的Java虚拟机(JVM),在开发企业级应用时,经常用于优化JVM性能,HotSpot也成为了企业应用工程师不可忽视的必备技能。而HotSpot是怎样运行的?HotSpot的高性能之谜?想知道HotSpot性能秘密的朋友们,请看过来~
从上一章,我们对HotSpot算法和策略有了初次了解,HotSpot中深层次的细节,涉及HotSpot的体系结构,性能检测技术,JVM运行时数据区和对象的内存储存形式,JVM的内存管理,垃圾回收算法,安全屏障等。本次为大家带来HotSpot更多细节方面的内容,了解HotSpot更为细节的实现,助力工程师们更好的优化项目性能。
HotSpot体系结构:三层架构
HotSpot的体系结构分层设计思想,每一层都有自己的任务和职责,从下至上依次是:编译器层,运行时数据区,垃圾回收器,JVM实现的平台相关部分,并且HotSpot VM的职责是去实现Java虚拟机规范里定义的“虚拟机”和“执行引擎”。
编译器层
编译器层负责将Java字节码编译成平台相关的本地机器指令,保证可移植性。
运行时数据区
运行时数据区负责分配和管理JVM运行期间所需的内存空间,可以称之为内存模型。
垃圾回收器
垃圾回收器负责回收和清理不再使用的对象,以及垃圾回收算法的实现等。
Java虚拟机规范实现
该层将JVM相关的规则、规范等编译成底层的机器码,实现平台相关的功能。
HotSpot性能检测
性能检测,是非常重要的。因为性能优化不是靠猜测来实现,需要有明确的数据作为依据,才能提供针对性的方案。
自检与统计
JVM内部提供了自检与统计的功能,在JVM初始化的时候会自动初始化和检测。JVM自检命令为:java -XX:+PrintFlagsInitial。
工具命令行
JVM使用JVM TI工具命令行查看JVM具体配置了哪些参数,常用的有:verbos-gc,-XX:+PrintFlagsInitial,-Xloggc:
性能分析工具
Java提供了jstat、jstack、jmap和jhat等工具对JVM进行分析。
JVM运行时数据区
JVM运行时数据区在《JVM运行时数据区》一文中已经有了详细说明,其中包括:
- 程序计数器:可以看成是当前线程所执行的字节码指令的行号指示器,记录着正在执行的虚拟机指令。
- Java虚拟机栈:Java虚拟机栈用于存储局部变量表和操作数栈,Java虚拟机栈是线程私有的,生命周期与线程相同。
- 本地方法栈:本地方法栈用于支持 native 方法的执行,是线程私有的。
- 堆:堆是所有线程共享的,用于存储所有引用对象和一些特殊的数组。堆是垃圾回收算法管理的主要区域。
- 方法区:方法区是所有线程共享的,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
- 运行时常量池:运行时常量池是方法区的一部分,用于存储编译期生成的各种字面量和符号引用。
HotSpot对象分配
HotSpot中的对象存储在堆区中,堆区的空间是由Eden Space、Survivor Space(From和To)和Tenured Space等部分组成,对象的分配是从Eden Space开始。当Eden Space被填满后,就会发生一次Minor GC,在Minor GC的过程中,Eden Space和Survivor Space(From)的空间中的对象会拷贝到Survivor Space(To)空间,在Minor GC的过程中,Eden Space和Survivor Space(From)的空间中的对象会被回收。而Survivor Space(To)空间中的对象会在下一次Minor GC中拷贝到Tenured Space空间,在Tenured Space空间中的对象则会在Full GC中被回收。
结语
本篇文章对HotSpot算法细节(二)进行了详细的介绍,包括HotSpot的体系结构,性能检测技术,JVM运行时数据区和对象的内存储存形式,JVM的内存管理,垃圾回收算法,安全屏障等。HotSpot的细节非常复杂,限于篇幅,本文只介绍了HotSpot的部分细节,希望能够对大家有所帮助。