今天咱们讲讲JDK9中的JVM GC调优参数,JDK9中JVM的参数总共有2142个,其中正式的参数有659个。好像比JDK8中的参数要少一点。java
为了方便你们的参考,特地将JDK9中的GC参数总结成了一张PDF,这个PDF比以前总结的JDK8的PDF在排版,颜色和内容准确性上面又有了很是大的提高,欢迎你们下载。git
今天这篇文章的内容都是从Oracle JDK9的官方文档中提炼出来的。对于里面的内容的真实性,我不能保证是100%正确的。github
有人要问了,官网文档也会有错误?数组
这个问题要从两个方面提及,第一方面,任何人都会犯错误,虽然官网文档通过了编辑,校验核对而后才发布,可是总会有一些遗漏的地方。服务器
第二,Oracle的文档是有专门的写文档的部门来专门编写的,写文档就是他们的工做,因此,这些文档并非开发JDK的开发人员编写的,而是和开发JDK不相关的文档编写员编写的。框架
至于文档写完以后有没有JDK开发人员过目,你们能够自行脑补......模块化
因此古人说得好,尽信书不如无书。
一代新人换旧人,长江后浪推前浪。由来只有新人笑 有谁听到旧人哭。性能
JDK9出现了,那么JDK8中的一些参数天然须要退伍了。spa
咱们回想一下JDK9中有些什么变化呢?我总结一下有三个。日志
模块化的本质就是将一个大型的项目拆分红为一个一个的模块,每一个模块都是独立的单元,而且不一样的模块之间能够互相引用和调用。
在module中会有元数据来描述该模块的信息和该模块与其余模块之间的关系。这些模块组合起来,构成了最后的运行程序。
这三个变化中和JVM最相关的就是第二个Xlog日志服务。
-Xusealtsigs / -XX:+UseAltSigs
这两个选项在JDK9中被废弃了,若是你不知道也不要紧,由于这两个选项是在Oracle Solaris中专有的。如今用Solaris服务器的人应该比较少了.....
下面这些选项是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
-Xincgc
增量GC在JDK9中被删除了。
-Xmaxjitcodesize=size
JIT中最大的code cache大小被替换成 -XX:ReservedCodeCacheSize
。
还有其余的一些CMS的参数。
AppCDS的全称是Application Class-Data Sharing。主要是用来在不一样的JVM中共享Class-Data信息,从而提高应用程序的启动速度。
一般来讲,若是要执行class字节码,JVM须要执行下面的一些步骤:给定一个类的名字,JVM须要从磁盘上面找到这个文件,加载,并验证字节码,最后将它加载进来。
若是JVM启动的时候须要加载成百上千个class,那么须要的就不是一个小数目了。
对于打包好的jar包来讲,只要jar的内容不变,那么jar包中的类的数据始终是相同的。JVM在启动时候每次都会运行相同的加载步骤。
AppCDS的做用就是将这些可以共享的数据归类成一个存储文件,在不一样的JVM中共享。
下面是AppCDS的大概工做流程:
相应的VM参数以下:
在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,对G1的调优是必不可少的。下面是G1的参数:
下面是通用的VM参数:
下面是JDK9中的通用GC参数:
下面是JDK9中的内存调整参数:
千言万语不如一张PDF。我把JDK9的GC参数总结成了一张PDF,下面是PDF的下载连接。
欢迎你们下载。
本文做者:flydean程序那些事本文连接:http://www.flydean.com/jdk9-gc-cheatsheet/
本文来源:flydean的博客
欢迎关注个人公众号:程序那些事,更多精彩等着您!