分享

总结经常使用的jvm调优参数

 liang1234_ 2020-10-31

本文总结项目中经常使用的一些重要的jvm参数

堆内存Xmx和Xms

  1. 每个服务程序我们可能都会调整堆内存大小,初始化和最大值,通过

-Xms[unit] 堆最小值
-Xmx[unit] 堆最大值
heap size设置的堆的大小,unit可以是k,m, g分别表示千字节,Mb,Gb。例如我们想配置最小堆为2G,最大堆为4G,如下:

java -Xms2g -Xmx4g -jar demo.jar
  1. PermSize和Metaspace size

在JDK1.8之前所有的静态类、方法,final值都保存到PermSize中,尤其是在启动tomcat时,我们通常加上-XX:PermSize=<size>参数。避免加载类过多导致OOM。
在JDK1.8之后时通过Metaspace size,替代了PermSize,据说会带来很多好处,尤其是OOM问题,JVM会自动的调整这个值,如果想通过参数指定,可以使用下面的参数:

-XX:MetaspaceSize=[unit] 初始值
-XX:MaxMetaspaceSize=[unit] 最大值

java -XX:MaxMetaspaceSize=128m -XX:MaxMetaspaceSize=256m

垃圾回收器

JVM有四种垃圾回收器实现:

  • Serial Garbage Collector
  • Parallel Garbage Collector
  • CMS Garbage Collector
  • G1 Garbage Collector

4种垃圾回收器实现机制,请自行搜索学习,网上资料很多

4中垃圾回收器,而可以通过下面参数来进行设置,指定在程序中使用哪种回收器:

-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC

垃圾回收器日志

当我们想看GC工作状态时,最简单的方式就是配置GC的日志,使用下面的参数,可以记录GC日志:

-XX:+UseGCLogFileRotation 重复覆盖,就像log4j一样
-XX:NumberOfGCLogFiles=< number of log files > 多少个文件之后,开始覆盖之前
-XX:GCLogFileSize=< file size >[ unit ] 每个日志文件大小
-Xloggc:/path/to/gc.log 日志文件保存路径和名称

例如,我们想将文件保存到/home/myan/gclogs/gc.log,保存3个log,每个log10M,那么配置如下:

-XX:+UseGCLogFileRotation  
-XX:NumberOfGCLogFiles=3
-XX:GCLogFileSize=10M 
-Xloggc:/home/myan/gclogs/gc.log

也可以加上两个额外的参数-XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps,打印GC的时间

内存溢出

在大型的应用中,我们经常碰到内存溢出(简称OOM),我们通常通过配置core dump,将内存中信息保存到dump文件,供我们分析,参数如下:

-XX:+HeapDumpOnOutOfMemoryError 当遇到OutOfMemoryError错误时,JVM会将dump heap到文件
-XX:HeapDumpPath=./java_pid.hprof 文件的保存路径,java进程的pid会追加到文件名中
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >" 当OOM发生时,需要执行的命令
-XX:+UseGCOverheadLimit

例如:想在发生OOM错误时,执行重启服务的脚本

-XX:OnOutOfMemoryError="./restart-svr.sh"

ratio的计算方法

跟我一起解两道数学题,就知道怎么计算了。O(∩_∩)O

  • SurvivorRatio

例题:如果SurvivorRatio=4,Young Gen为30M,那么Eden和Survivor分别时多少?

令:   
S = SurvivorSpace   
E = Eden   
Y = Young generation    
根据条件得到:     
S/E = 1/4  那么 E = 4S
2S + E = Y
2S + 4S = Y
S = Y/6
带入数字30,得到:S = 30/6 = 5M,得到Survivor=5M,Eden=20M
  • NewRatio

例题:如果NewRatio=3, HeapSize=40M, 那么Young Gen为多少?

令:
T = Tenured
Y = Young Gen
H = Heap
根据条件得到:    
Y/T = 1/3
Y + T = H
Y + 3Y = H
4Y = H
带入数字40, 得到:4Y = 40, Y = 10,所以Young Gen为10M,那么Tenured为30M

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多