一文了解JDK12 13 14 GC调优秘籍-附PDF下载
liuian 2025-04-27 14:44 34 浏览
简介
想了解JDK12,13,14中的GC调优秘籍吗?想知道这三个版本中JVM有什么新的变化吗?
一起来看看这期的GC调优秘籍,因为JDK12,13,14中的GC变化不太大,所以这里一起做个总结,文末附有相应的PDF下载,希望大家能够喜欢。
那些好用的VM参数
我们再讲几个之前的版本中没有讲过的比较好用的VM参数。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=path
我们写java程序的,经常会碰到程序报
java.lang.OutOfMemoryError异常,这时候优秀的我们是怎么解决的呢?
高级程序员一看到这个错误,就知道heap空间不够用了,加大heap空间吧。
但是聪明的程序员可能就会问了,为什么会出现这个OutOfMemoryError异常呢?是不是我们程序里面有没有问题呢?
带着这个疑问,聪明的程序员可能会使用jmap命令将heap dump出来,甚至有些程序员可以熟练的使用jcmd pid GC.heap_info命令来查看heap info了。
这些都很好,但是如果使用上面两个JVM选项,程序只要出现OutOfMemoryError,就会自动将heap dump出来,默认的文件名是java_pid.hprof ,你也可以自己指定文件路径。
-XX:+PrintClassHistogram
有时候,我们需要统计class的信息,那么可以使用这个选项。
在windows环境中收到Control+C,或者在linux环境中收到Control+Break信号的时候就会触发相应的统计事件。
这个参数和 jmap -histo command 或者 jcmd pid GC.class_histogram效果是一样的。
有小伙伴要问了,Control+C和Control+Break信号是什么鬼?怎么将信号传递给java程序呢?
这里给大家扩展讲一下,发送信号可以用kill命令。
kill其实有两种用法。
第一种 kill pid,kill后面直接跟一个pid。
第二中 kill -TERM pid, TERM就是我们要向kill传递的信号。
其实kill pid 就是 kill -15 pid的简写。
我们是用kill -l来看一下kill支持的信号类型:
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
我们常用的9=SIGKILL,也就是向JVM传递一个强制kill的信号。
注意,这些信号中,除了9这个信号可以无条件终止进程,其他的信号进程都有权利忽略。所以有时候我们使用kill pid命令去终止进程,但是进程没反应。不是因为进程坏了,而是因为进程忽略掉了你发出的信号。
-XX:+PrintConcurrentLocks
同样的,PrintConcurrentLocks也是收到Control+Break或者Control+C信号时,输出java.util.concurrent的lock信息。
这个参数和jstack -l 或者jcmd pid Thread.print -l效果是一样的。
-XX:+PrintFlagsRanges
再来看一个比较有用的参数PrintFlagsRanges。有时候我们想使用某些VM的参数,但是不知道这些参数的取值范围,那么可以使用PrintFlagsRanges。我们试一下:
是不是非常有用?
G1的变化
JVM在发展,G1的参数也在发展,这几个版本中有几个G1的参数名发生了变化:
-XX:DefaultMaxNewGenPercent 替换成为-XX:G1MaxNewSizePercent=percent
-XX:G1OldCSetRegionLiveThresholdPercent 替换成为
-XX:G1MixedGCLiveThresholdPercent=percent
-XX:DefaultMinNewGenPercent替换成为-XX:G1NewSizePercent=percent
配置FlightRecorder
Java Flight Recorder(JFR)是JVM的诊断和性能分析工具。它可以收集有关JVM以及在其上运行的Java应用程序的数据。JFR是集成到JVM中的,所以JFR对JVM的性能影响非常小,我们可以放心的使用它。
一般来说,在使用默认配置的时候,性能影响要小于1%。
JFR是一个基于事件的低开销的分析引擎,具有高性能的后端,可以以二进制格式编写事件。
JFR是JVM的调优工具,通过不停的收集JVM和java应用程序中的各种事件,从而为后续的JMC分析提供数据。
Event是由三部分组成的:时间戳,事件名和数据。同时JFR也会处理三种类型的Event:持续一段时间的Event,立刻触发的Event和抽样的Event。
为了保证性能的最新影响,在使用JFR的时候,请选择你需要的事件类型。
JFR从JVM中搜集到Event之后,会将其写入一个小的thread-local缓存中,然后刷新到一个全局的内存缓存中,最后将缓存中的数据写到磁盘中去。
或者你可以配置JFR不写到磁盘中去,但是这样缓存中只会保存部分events的信息。
FlightRecorder有两部分的配置,第一部分是配置FlightRecorder本身的大小,存储等信息。第二部分是FlightRecorder的开启选项。
我们看下FlightRecorder相关的配置参数:
-XX:FlightRecorderOptions:parameter=value
下面是StartFlightRecording的配置:
-XX:StartFlightRecording=parameter=value
RAM参数
默认情况下,JVM的MaxHeapSize是根据RAM的大小来自动配置的,比如说,我有一个8G内存的机子,执行下面的命令:
java -XX:+PrintFlagsFinal -version | grep -Ei "maxheapsize|maxram"
可以看到MaxHeapSize= MaxRAM / MaxRAMPercentage。
VM也提供了下面几个用来设置RAM相关的参数:
-XX:MaxRAM=size
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
主要就是设置最大的RAM值和Heap占RAM的比例。
RAM参数主要是为了java在容器中运行配置的。
JDK13中的ZGC
在JDK13中,我们可以开启ZGC的体验了。ZGC是一个可扩展的,低延迟的GC。ZGC是并发的,而且不需要停止正在运行的线程。
ZGC是在JDK11中被引入的。
我们通过下面的方式来开启ZGC:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
RTM支持
Restricted Transactional Memory(RTM)是受限的事务性存储器,是Intel在x86微架构中所引入的指令集系统,它属于TSX(Transactional Synchronization Extensions,事务性同步扩展)指令集扩展。
RTM主要用来在多线程环境中提升执行效率。
RTM引入了XBEGIN, XABORT, XEND和XTEST。通过将指令包含在XBEGIN和XEND之间,可以达到transaction的效果。
可以将RTM看做是一个粗粒度的锁,XBEGIN和XEND之间包含的代码就是要执行的程序。RTM可以由硬件自动检测操作中的数据冲突,保证事务性操作的正确性,从而发掘操作间的并行性。
同时RTM还可以减少CPU cache line的false-sharing。
RTM支持主要有4个参数:
-XX:+UseRTMLocking
-XX:+UseRTMDeopt
-XX:RTMAbortRatio=abort_ratio
-XX:RTMRetryCount=count
其中UseRTMDeopt和RTMAbortRatio是联合起来用的。
之前我们讲到RTM会对粗粒度的锁进行优化,但如果真的是多线程并发执行访问同样资源的时候,这个优化实际上是不成功的,会被abort,然后回退到正常的锁状态。
如果abort超出了一定的比例,则会将RTM代码反优化。
总结
好了,就总结这么多。下面是JDK12,13,14的GC调优秘籍,欢迎下载。
- JDK12GC-cheatsheet.pdf
- JDK13GC-cheatsheet.pdf
- JDK14GC-cheatsheet.pdf
本文作者:flydean程序那些事
本文链接:
http://www.flydean.com/jdk12-13-14-gc-cheatsheet/本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
- 上一篇:四个Java死锁检测工具
- 下一篇:这些不可不知的JVM知识,我都用思维导图整理好了
相关推荐
- tenda登录密码(tenda登录入口密码)
-
腾达路由器登录的密码和用户名为ADMIN。老版的兴化的都使用的是这一个用户名和密码新出的版本,登录的地址和用户名密码都在路由器背面,标签上的是随机产生的,没有规律,只需查看按照地址输入用户名和密码,就...
- android系统更新(android系统更新opengl版本)
-
1.1、打开手机页面,点击进入oppo的官网;2、进入页面后,点击下载系统包的按钮,系统自动升级。2.1、持手机卡去oppo手机专卖店;2、刷卡在专卖店里直接升级。3.1、打开电脑,开机进入页面;2、...
- tplink路由器登录名和密码(tp link无线路由器用户名和密码)
-
1、tp-link无线路由器,上网账号就是宽带账号,口令就是宽带密码,设置方法如下:一、接线方法,外网进线接入路由器wan口,路由器lan口接线到电脑网线接口。二、路由器设置,打开浏览器http://...
- win10硬盘格式mbr还是guid(won10硬盘格式)
-
作为人类的我回答你的问题。在选择WIN10分区类型时,我建议使用GUID分区表(GPT)。原因如下:1.GPT支持更大容量的硬盘,可以处理大型数据存储需求,而MBR分区表限制了最大可用空间为2TB。...
-
- 台式电脑网线怎么插(台式电脑网线插在猫上还是路由器上)
-
1、如果你家里没有用路由器,那么电脑主机上的网线,需要插在猫的网口/LAN口。温馨提示:没有用路由器的情况下,电脑要上网的话,你需要打开电脑中的“宽带连接”程序,然后填写你家的宽带账号、宽带密码,就能连接上网了。如果你不知道如何用“宽带连...
-
2025-11-08 03:05 liuian
- 电脑开机进入不了系统怎么办
-
电脑开机正常但无法进入系统,一般是系统故障或硬件故障。硬件故障:通常是电压不稳定导致,安装稳压器能解决。或者是主机机箱内灰尘过多,导致容易产生静电,清理机箱灰尘,重新拔插内存条可解决。把电脑关机之后重...
- 电脑不能正常关机(电脑强制关机后无法正常启动)
-
1解决电脑无法关机的方法2电脑无法关机可能是由于软件冲突、系统故障或者硬件问题等原因造成的。可以尝试以下几种解决方法:a)强制关机:按住电脑主机上的电源按钮直到电脑完全关闭,但这种方法可能会...
- qq对战平台下载官网(qq对战平台安卓版)
-
1.在左边游戏分类上选择你想要玩的游戏,双击游戏名称(cs,魔兽,星际);2.右边房间列表出现不同游戏版本的房间,请对应你安装的游戏的版本选择房间,双击进入;3.点击“设置”按钮,弹出QQ对战平台...
- 分区助手专业版下载(分区助手6.0中文版)
-
区别主要有以下几点:1.功能差异:傲梅分区助手绿色版相对于专业版功能较少,仅提供基本的分区操作,如创建、删除、合并、移动、调整分区大小等,而专业版则提供更多的高级功能,如转换磁盘类型、拷贝分区、修复...
- 驱动程序在哪里找(驱动程序在哪里找出来)
-
驱动程序在电脑中可以这样查找:1.打开设备管理器:在Windows系统中,你可以通过“控制面板”>“设备管理器”来打开设备管理器。2.查找驱动程序:在设备管理器中,你可以看到你的电脑中安装的...
- 用光盘怎么重装系统(用光盘怎么重装系统win7)
-
惠普笔记本有系统光盘重装系统的具体步骤如下:1、当我们用光盘来进行系统重装的时候,我们需要准备好微软系统的系统盘。2、首先我们打开电脑机箱上的光驱,直接放入光碟,此时电脑会自动重启进入读取系统光盘操作...
- 质量管理体系有哪些(永辉质量管理体系有哪些)
-
常见4种。见下: 质量管理体系常用的包括ISO9000质量管理体系、精益生产管理体系、六西格玛质量管理体系、资质体系等。ISO9000...
- 联想电脑如何截屏截图(联想电脑上怎样截图)
-
用lenovo电脑如果想截屏,我们可以采用了以下几个方法。一个方法就是用笔记本电脑截屏的快捷键来进行截屏。我们在浏览网页的时候,如果想把网页截屏下来,可以用笔记本电脑的Prtsc键。这个键就是截屏的...
- 软件升级后怎么恢复以前的版本
-
不能恢复了,出现新版本后低版本验证就会关闭。1、软件升级软件升级,是指软件开发者在编写软件的时候,由于设计人员考虑不全面或程序功能不完善,在软件发行后,通过对程序的修改或加入新的功能后,以补丁的形式发...
- 好看的鼠标指针图片(漂亮鼠标指针下载)
-
鼠标指针是计算机用户界面中常见的元素之一,其基本形状主要有以下几种:1.默认指针:通常是一个箭头的形状,这是最常见的鼠标指针。当系统处于就绪、等待状态,或者用户没有进行任何操作时,鼠标指针会显示为这...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
