简介

想理解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) SIGUSR111) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+338) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+843) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-758) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-263) 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的博客

欢送关注我的公众号:程序那些事,更多精彩等着您!