JVM实战(5)——理论基础篇: JVM参数
Java虚拟机(JVM)参数的正确配置对于优化应用程序的性能和稳定性至关重要。本文将深入探讨JVM参数的不同类型和常用配置,帮助读者理解如何根据应用程序的需求进行合理的参数调整,以达到最佳性能。
一、JVM参数的分类
1.1 JDK1.8之前
1.1.1 标准参数(Standard)
标准参数是所有Java虚拟机都支持的通用参数,比如: -version
。我们在终端里输入java
这个命令,这个时候控制台打印出的内容就描述了参数相关的信息,这些参数就是标准参数。如图:
1.1.2 非标准参数(Non-Standard)
非标准参数是特定于不同JVM实现的参数,通常以-X
开头,不保证所有的VM 实现都受支持,并且在后续的JDK版本中可能会随时更改而不事先通知。
这些参数包括-Xms
和-Xmx
,用于设置JVM的初始堆大小和最大堆大小;-Xss
,用于设置线程栈大小;-Xmn
,用于设置年轻代大小等。我们将逐一介绍这些参数,并解释它们对应用程序性能的影响。
1.1.3 不稳定参数(Not Stable)
通常以-XX:
开头,可能随时更改而不事先通知。这些参数提供了更高级的配置选项,用于调整垃圾回收器、内存分配和线程模型等方面的行为。我们将讨论一些常用的非标准参数,如-XX:+UseConcMarkSweepGC
和-XX:MaxGCPauseMillis
,它们可以在特定场景下显著提高应用程序的性能。
需要注意的是,不稳定参数针对不同版本的虚拟机,也是不一样的,而且,官方文档介绍的也很少。具体你所使用的JDK版本支持哪些不稳定参数,后面会有详细的方法说明。
1.2 JDK1.8之后
1.2.1 标准参数(Standard)
与1.8之前定义一致,具体可参考上面描述。
1.2.2 非标准参数(Non-standard)
与1.8之前定义一致,具体可参考上面描述。
1.2.3 高级运行时参数(Advanced Runtime)
这些参数控制了Java HotSpot VM的运行时行为。
1.2.4 高级JIT编译器参数(Advanced JIT Compiler)
这些参数控制了Java HotSpot VM执行的动态即时(JIT)编译。
1.2.5 高级使用性参数(Advanced Serviceability)
这些参数提供了手机系统信息和执行广泛调试的能力。
1.2.6 高级垃圾回收器参数(Advanced Garbage Collection)
这些参数控制了Java HotSpot VM如何执行垃圾收集(GC)。
根据JDK1.8前后的对比,我们可以看到1.8之后只是将不稳定参数又做了进一步的细分。是否细分对于这些参数的使用并无影响,只是更方便我们划分类型和记忆,这里就不再过多赘述。具体每个分类包含哪些参数以及参数的说明,可以到参考资料中查找官方文档。
二、如何找到Not stable有哪些?
2.1 Oracle官方文档
Oracle官方文档提供了比较详细的介绍信息,但只是做了很小一部分的说明,并没有给出全部的参数,而且针对不同版本的HotSpot,也不会提供具体的不稳定参数。如下是官方文档的内容:
2.2 OpenJdk源码
通过OpenJdk的源码查找是一个相对来说比较普遍适用的方式,但是,需要我们根据具体的代码和注释,来理解具体参数的含义。虽然没有文档说明来的直观,但也是更为准确,而且不会被误导的方式。在没有明确文档说明的情况下,这种方式显得尤为重要。
下面,我们来说明下具体如何查找对应JDK版本的不稳定参数。
2.2.1 确定目标版本
首先需要先确定我们运行时环境的JDK版本,通过java -version
命令查看即可。
图中,我们如下三行信息:
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
这里解析一下:
java version "1.8.0_121":这表示使用的是Java 1.8版本的第121次更新。Java版本号通常以主版本号.次版本号.修订号的形式呈现。在这里,主版本号是1,次版本号是8,修订号是121。 Java(TM) SE Runtime Environment (build 1.8.0_121-b13):这表示Java标准版(Java SE)运行时环境的构建版本为1.8.0_121-b13。Java SE是Java的标准版本,提供了Java应用程序运行所需的基本库和工具。 Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode):这表示正在使用Java HotSpot虚拟机(JVM)的64位服务器版本,构建版本为25.121-b13。Java HotSpot虚拟机是Oracle官方提供的一种Java虚拟机实现,它负责将Java字节码翻译成机器码并执行程序。64位服务器版本是为在64位服务器上运行Java应用程序而优化的。 总结起来,你使用的是Java 1.8版本的第121次更新,基于Java SE运行时环境构建,并且使用Java HotSpot虚拟机的64位服务器版本来执行程序。
2.2.2 查找对应OpenJdk版本的源码
首先我们要先登录openJdk官方,然后根据JDK的主版本号,找到对应的JDK链接:
如图所示,有两个JDK8版本的,具体选择哪个呢?这里说明一下:
JDK 8是Java SE 8的初始版本,而JDK 8u是JDK 8的更新版本,用于修复错误、漏洞和其他问题,并提供一些增强和改进。在使用时,通常建议使用最新的更新版本,以获取最新的修复和功能。
所以,我们选择jdk8u这个链接,如下图所示:
我们可以选择Master或者dev的,然后点击下面的hotspot链接。
如上图,选择左侧的tags。此时,根据我们的JDK版本信息,121-b13进行搜索,如下图:
点击对应链接,选择左侧的的zip/gz/bz2链接即可下载源码文件,如图:
2.2.3 查找不稳定参数源文件
将上面下载的压缩包解压后,查看src/share/vm/runtime/globals.hpp
文件内容即可看到参数。
例如,我们可以找到OmitStackTraceInFastThrow这个参数,它在官方的文档中是没有描述的。
三、参考资料
Oracle官方文档:https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
OpenJDK官网:https://hg.openjdk.org/
- 本文标签: JVM 调优实战 理论基础
- 本文链接: https://www.v8en.com/article/329
- 版权声明: 本文由SIMON原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权