原创

JVM实战(5)——理论基础篇: JVM参数

温馨提示:
本文最后更新于 2023年07月19日,已超过 490 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

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/

 

正文到此结束
本文目录