一张PDF了解JDK9 GC调优秘籍-附PDF下载
简介
今天我们讲讲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的下载链接。
欢迎大家下载。
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/jdk9-gc-cheatsheet/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
一张PDF了解JDK9 GC调优秘籍-附PDF下载的更多相关文章
- 一张PDF了解JDK11 GC调优秘籍-附PDF下载
目录 简介 废弃的VM选项 Source-File Mode Code Heap状态分析 AppCDS 总结 简介 JDK11相比JDK10,添加了一个新的Source-File Mode,可以直接通 ...
- 一张PDF了解JDK10 GC调优秘籍-附PDF下载
目录 简介 Java参数类型 Large Pages JIT调优 总结 简介 今天我们讲讲JDK10中的JVM GC调优参数,JDK10中JVM的参数总共有1957个,其中正式的参数有658个. 其实 ...
- 一文了解JDK12 13 14 GC调优秘籍-附PDF下载
目录 简介 那些好用的VM参数 G1的变化 配置FlightRecorder RAM参数 JDK13中的ZGC RTM支持 总结 简介 想了解JDK12,13,14中的GC调优秘籍吗?想知道这三个版本 ...
- 八张图彻底了解JDK8 GC调优秘籍-附PDF下载
目录 简介 分代垃圾回收器的内存结构 JDK8中可用的GC 打印GC信息 内存调整参数 Thread配置 通用GC参数 CMS GC G1参数 总结 简介 JVM的参数有很多很多,根据我的统计JDK8 ...
- JVM GC调优一则--增大Eden Space提高性能
版权声明:本文为横云断岭原创文章,未经博主同意不得转载.微信公众号:横云断岭的专栏 https://blog.csdn.net/hengyunabc/article/details/24924843 ...
- JVM GC调优一则–增大Eden Space提高性能
缘起 线上有Tomcat升级到7.0.52版,然后有应用的JVM FullGC变频繁,在高峰期socket连接数,Cpu使用率都暴增. 思路 思路是Tomcat本身的代码应该是没有问题的,有问题的可能 ...
- JVM系列(四)之GC调优
JVM内存参数调优 为什么要GC调优? 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但当你的系统时常报了内存溢出或者 ...
- troubleshoot之:GC调优到底是什么
目录 简介 那些GC的默认值 GC的选择 GC的最大线程个数 初始化heap size 最大的heap size 分层编译技术 我们到底要什么 最大暂停时间 吞吐率 简介 我们经常会听到甚至需要自己动 ...
- 生产服务GC调优实践基本流程总结
Photo by Pixabay from Pexels 本文作者:夜色微光 - 博客园 (cnblogs.com) 前言 对Java虚拟机进行性能调优是一个非常宽泛的话题,在实践上也是非常棘手的过程 ...
随机推荐
- Shell 脚本(五) Shell 工具 及 企业面试题
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 十.Shell工具(重点) 1.cut cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的. ...
- Java实现 LeetCode 606 根据二叉树创建字符串(遍历树)
606. 根据二叉树创建字符串 你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串. 空节点则用一对空括号 "()" 表示.而且你需要省略所有不影响字符串与原 ...
- Java实现蓝桥杯模拟树的叶结点数量
问题描述 一棵包含有2019个结点的树,最多包含多少个叶结点? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分. ...
- Java实现 LeetCode 29 两数相除
29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商 ...
- java实现第四届蓝桥杯空白格式化
空白格式化 本次大赛采用了全自动机器测评系统. 如果你的答案与标准答案相差了一个空格,很可能无法得分,所以要加倍谨慎! 但也不必过于惊慌.因为在有些情况下,测评系统会把你的答案进行"空白格式 ...
- java实现第九届蓝桥杯三角形面积
三角形面积 小明最近在玩一款游戏.对游戏中的防御力很感兴趣. 我们认为直接影响防御的参数为"防御性能",记作d,而面板上有两个防御值A和B,与d成对数关系,A=2^d,B=3^d( ...
- 如何在微信小程序中使用骨架屏
先上效果图
- [AGC043-D]Merge Triplets
题目 点这里看题目. 分析 我们不妨来考虑一下生成的序列有什么性质. 为了方便表示,我们将序列\(S\)的第\(i\)项写为\(S[i]\). 首先考虑如果所有的\(A\)序列都是递增 ...
- MySQL示例数据库导入_1
做个测试需要有适当量的数据库,于是找到了下面这个MySQL(超过30w记录), 1)先Git clone https://github.com/datacharmer/test_db ...
- 关联函数-web_save_param_length
int web_save_param_length(const char * Param,const char * Base,LAST); 参数说明: Param:保存长度的参数的名称. Base:参 ...