简介
今天我们讲讲 JDK9 中的 JVM GC 调优参数,JDK9 中 JVM 的参数总共有 2142 个,其中正式的参数有 659 个。好像比 JDK8 中的参数要少一点。
为了方便大家的参考,特意将 JDK9 中的 GC 参数总结成了一张 PDF,这个 PDF 比之前总结的 JDK8 的 PDF 在排版,颜色和内容准确性上面又有了非常大的提升,欢迎大家下载。
Oracle 中的文档
今天这篇文章的内容都是从 Oracle JDK9 的官方文档中提炼出来的。对于里面的内容的真实性,我不能保证是 100% 正确的。
有人要问了,官网文档也会有错误?
这个问题要从两个方面说起,第一方面,任何人都会犯错误,虽然官网文档经过了编辑,校验核对然后才发布,但是总会有一些遗漏的地方。
第二,Oracle 的文档是有专门的写文档的部门来专门编写的,写文档就是他们的工作,所以,这些文档并不是开发 JDK 的开发人员编写的,而是和开发 JDK 不相关的文档编写员编写的。
至于文档写完之后有没有 JDK 开发人员过目,大家可以自行脑补 ……
所以古人说得好,尽信书不如无书。
JDK9 中 JVM 参数的变化
一代新人换旧人,长江后浪推前浪。由来只有新人笑 有谁听到旧人哭。
JDK9 出现了,那么 JDK8 中的一些参数自然需要退伍了。
我们回想一下 JDK9 中有些什么变化呢?我总结一下有三个。
- 最大的变化就是引入了 JPMS(Java Platform Module System)也就是 Project Jigsaw。
模块化的本质就是将一个大型的项目拆分成为一个一个的模块,每个模块都是独立的单元,并且不同的模块之间可以互相引用和调用。
在 module 中会有元数据来描述该模块的信息和该模块与其他模块之间的关系。这些模块组合起来,构成了最后的运行程序。
- 然后就是引入的 Xlog 日志服务,通过 Xlog 日志服务我们可以监控 JVM 中的事件,比如:GC,class loading,JPMS,heap,thread 等等。
- 最后就是将 String 中的底层存储从 char 数组换成了 byte 数组。
这三个变化中和 JVM 最相关的就是第二个 Xlog 日志服务。
废弃的 JVM 选项
-Xusealtsigs / -XX:+UseAltSigs
这两个选项在 JDK9 中被废弃了,如果你不知道也没关系,因为这两个选项是在 Oracle Solaris 中专有的。现在用 Solaris 服务器的人应该比较少了 …..
不推荐 (Deprecated) 的 JVM 选项
下面这些选项是 JVM 已经不再推荐使用了,如果你使用的话也没问题,但是会有报警。
Deprecated 表示这些选项会在未来被删除,我们应该尽量避免使用这些选项。
选项有很多,我们挑一些比较常见和重要的来给大家讲解一下。
-d32 / -d64
为什么这两个参数会被不推荐呢?因为现在的服务器性能已经非常非常的好了。
如果你的 JDK 是 64 位的,那么默认就启用了 -server 和 -d64 模式,32 位的 JDK 现在应该很少见到了。
Oracle 官方文档说只有 Java HotSpot Server VM 才有 64 位的模式。不知道是真是假,因为其他的 VM 我也没有用过,没有发言权。
-Xloggc:garbage-collection.log
因为 JDK9 中引入 Xlog 框架,所以之前的日志输出的参数都被替换成了新的 Xlog 格式:
比如上面的命令被替换成为 -Xlog:gc:garbage-collection.log
所以那些以 Print 开头的 GC 日志输出参数都是不推荐的。我们需要使用 Xlog 来替代。
同样的以 Trace 开头的运行时日志输出参数也是不推荐的,也可以使用 Xlog 来替代。
-XX:+UseConcMarkSweepGC / -XX:CMS*
CMS 在 JDK9 中是不被推荐的,所以 CMS 开头的参数都不要用了。
-XX:+UseParNewGC
因为 ParNewGC 是和 CMS 一起使用的,所以 CMS 不推荐之后,ParNewGC 也是不推荐使用的。
-XX:MaxPermSize=size / -XX:PermSize=size
JDK8 中,Prem 区已经被移到了 Metaspace,所以上面的参数可以被下面的替代:
-XX:MaxMetaspaceSize=size / -XX:MetaspaceSize=size
被删除的 JVM 参数
-Xincgc
增量 GC 在 JDK9 中被删除了。
-Xmaxjitcodesize=size
JIT 中最大的 code cache 大小被替换成 -XX:ReservedCodeCacheSize
。
还有其他的一些 CMS 的参数。
JDK9 的新特性 Application Class Data Sharing
AppCDS 的全称是 Application Class-Data Sharing。主要是用来在不同的 JVM 中共享 Class-Data 信息,从而提升应用程序的启动速度。
通常来说,如果要执行 class 字节码,JVM 需要执行下面的一些步骤:给定一个类的名字,JVM 需要从磁盘上面找到这个文件,加载,并验证字节码,最后将它加载进来。
如果 JVM 启动的时候需要加载成百上千个 class,那么需要的就不是一个小数目了。
对于打包好的 jar 包来说,只要 jar 的内容不变,那么 jar 包中的类的数据始终是相同的。JVM 在启动时候每次都会运行相同的加载步骤。
AppCDS 的作用就是将这些能够共享的数据归类成一个存储文件,在不同的 JVM 中共享。
下面是 AppCDS 的大概工作流程:
- 选择要归档的 class,并创建一个 class 的列表,用在归档中。(-XX:DumpLoadedClassList)
- 创建归档文件(-Xshare:dump 和 -XX:SharedArchiveFile)
- 使用归档文件(-Xshare:on 和 -XX:SharedArchiveFile)
相应的 VM 参数如下:
JDK9 的新特性 Xlog
在 java 程序中,我们通过日志来定位和发现项目中可能出现的问题。在现代 java 项目中,我们使用 log4j 或者 slf4j,Logback 等日志记录框架来处理日志问题。
JVM 是 java 程序运行的基础,JVM 中各种事件比如:GC,class loading,JPMS,heap,thread 等等其实都可以有日志来记录。通过这些日志,我们可以监控 JVM 中的事件,并可以依次来对 java 应用程序进行调优。
在 JDK9 中引入的 Xlog 日志服务就是为这个目的而创建的。
通过 xlog,JDK 将 JVM 中的各种事件统一起来,以统一的形式对外输出。通过 tag 参数来区分子系统,通过 log level 来区分事件的紧急性,通过 logging output 来配置输出的地址。
在 JDK9 之后,之前的 Print* 参数都被 Xlog 所代替了。
我们看下常用的 Xlog 和 GC 日志参数:
JDK9 中的 G1 参数
作为 JDK9 中的默认垃圾回收器 G1,对 G1 的调优是必不可少的。下面是 G1 的参数:
JDK9 中的通用 VM 参数
下面是通用的 VM 参数:
JDK9 中的通用 GC 参数
下面是 JDK9 中的通用 GC 参数:
JDK9 中的内存调整参数
下面是 JDK9 中的内存调整参数:
总结
千言万语不如一张 PDF。我把 JDK9 的 GC 参数总结成了一张 PDF,下面是 PDF 的下载链接。
JDK9GC-cheatsheet.pdf
欢迎大家下载。
本文作者:flydean 程序那些事
本文链接:http://www.flydean.com/jdk9-gc-cheatsheet/
本文来源:flydean 的博客
欢迎关注我的公众号: 程序那些事,更多精彩等着您!