jvm调优
JVM调优的一般步骤为:
第1步:分析GC日志及dump文件,判断是否需要优化,确定瓶颈问题点;
第2步:确定JVM调优量化目标;
第3步:确定JVM调优参数(根据历史JVM参数来调整);
第4步:调优一台服务器,对比观察调优前后的差异;
第5步:不断的分析和调整,直到找到合适的JVM参数配置;
第6步:找到最合适的参数,将这些参数应用到所有服务器,并进行后续跟踪。
-XX 参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。如果此类参数设置合理将大大提高JVM 的性能及稳定性
-XX:+<option> '+'表示启用该选项
-XX:-<option> '-'表示关闭该选项
-Xmx12g 堆内存最大值为12GB 。
-Xms建议与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
-Xmn //官方推荐配置为整个堆的3/8
-Xss 默认1m //减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
-XX:NewRatio=4 设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=8:设置年轻代中Eden区与Survivor区的大小比值。设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:MaxDirectMemorySize=1G:直接内存。报java.lang.OutOfMemoryError: Direct buffer memory 异常可以上调这个值
-XX:ConcGCThreads=4:CMS垃圾回收器并行线程线,推荐值为CPU核心数。
-XX:ParallelGCThreads=8:新生代并行收集器的线程数。
参数说明
-XX:MetaspaceSize=128m(元空间默认大小)
-XX:MaxMetaspaceSize=128m(元空间最大大小)
-Xms1024m(堆最大大小)-Xmx1024m(堆默认大小)
-Xmn256m(新生代大小)-Xss256k(棧最大深度大小)
-XX:SurvivorRatio=8(新生代分区比例8:2)
-XX:+UseConcMarkSweepGC(指定使用的垃圾收集器,这里使用CMS收集器)
-XX:+PrintGCDetails(打印详细的GC日志)
-XX:MetaspaceSize=128m(元空间默认大小)
-XX:MaxMetaspaceSize=128m(元空间最大大小)
ZGC 通用的参数
-XX:MinHeapSize, -Xms 最小堆大小 (default = 8388608 = 8M)
-XX:InitialHeapSize, -Xms 初始化堆大小 (default = 134217728 = 128M )
-XX:MaxHeapSize, -Xmx 最大堆大小 (default = 2134900736 = 2036M)
-XX:SoftMaxHeapSize JVM堆的最大软限制 (default = 2134900736 = 2036M)
-XX:ConcGCThreads 并发GC的线程数量(default -XX:+ConcGCThreads=1 )
-XX:ParallelGCThreads 设置垃圾回收时的并行GC线程数量 (default = 4 )
-XX:UseLargePages 使用大页面内存 (dafault false)
-XX:UseTransparentHugePages 使用Transparent大页面内存
-XX:UseNUMA 使用UNMA内存分配,可以获得更好的性能
-XX:SoftRefLRUPolicyMSPerMB 每MB的空闲内存空间允许软引用对象存活时间(default = 1000)
-XX:AllocateHeapAt = 堆分配参数,可以使用非DRAM 内存,这个参数将指向文件系统的文件并使用内存映射来达到在备用存储设备上进行堆分配。
2.2.2 ZGC 特有的参数
-XX:ZAllocationSpikeTolerance 修正系数,数值越大,越早触发GC (default = 2.000000)
-XX:ZCollectionInterval ZGC发生的最小时间间隔 ,秒 (default = 0.000000)
-XX:ZFragmentationLimit relocation时,当前region碎片化大于此值,则回收region (default = 25.000000) -XX:ZMarkStackSpaceLimit 指定为标记堆栈分配的最大字节数 (default = 8589934592 = 8096M)
-XX:ZProactive 是否启用主动回收 (default true)
-XX:ZUncommit 是否归还不使用的内存给OS(default true)
-XX:ZUncommitDelay 不再使用的内存最多延迟多久会归还给OS (default = 300 s)
2.2.3 ZGC的一些诊断参数
-XX:+UnlockDiagnosticVMOptions 使用诊断模式,下面的参数才会起作用
-XX:ZStatisticsInterval 指定统计数据输出之间的时间间隔(秒)。
-XX:ZVerifyForwarding 检验转发表 -XX:ZVerifyMarking 检验标记集
-XX:ZVerifyObjects 检验对象 -XX:ZVerifyRoots 检验根节点
-XX:ZVerifyViews 检验堆视图访问
2.3 启用ZGC
-XX:+UseZGC 启用ZGC
-XX:+UseZGC -Xmx-Xlog:gc
-XX:+UseZGC -Xmx-Xlog:gc* 可以打印更详细的GC日志
2.4 可优化参数详解
2.4.1 堆参数的设置
ZGC比较重要的调优参数是设置最大堆内存(-Xmx<size>)., ZGC设置一个最大堆内存有两个考量:1.堆可以容纳程序的存活集 2.堆中要有足够的空间允许GC运行时分配.
然而多大内存合适这就要根据 内存使用情况以及GC频率来确定。
2.4.2 并发GC线程数设置
另一个调优参数就是并发GC线程数量的设置 (-XX:ConcGCThreads=<number>) 。
一般情况下ZGC可以自动选择一个合适的值,但是也要根据程序的特点来修改。这个参数对GC使用CPU的时间影响比较大,如果数量太大的话,GC线程会占用过多的CPU时间,数量过少的话垃圾回收有会不及时。通常情况下如果程序的低延迟很重要,那么CPU使用率最好永远不要超过70%。
2.4.3 将不用的内存返回给OS
默认情况下,ZGC会将不使用的内存还给OS。可以使用XX:-ZUncommit 取消这一功能。然而如果实际堆内存比最小堆内存都小的话,肯定不会将不使用的内存返还给OS,另外最大堆内存(-Xmx)和最小堆内存 (-Xms) 的设置相等的话,也不会起作用。
另外可以设置延迟归还对内存的时间 -XX:ZUncommitDelay=<seconds>
2.4.4 在Linux中开启大页支持
在Linux操作系统中,采用内存映射来管理内存,逻辑页面映射到对应的物理内存,
使用大页面这个参数在吞吐量,低延迟,启动时间方面都有很好的性能提升,可以说除了设置起来有点复杂之外,没有任何的缺点。设置这个参数需要Root权限,所以默认没有开启。
2.4.5 Linux中使用大透明页
Linux下的大页分为两种标准,大页(Huge Pages)和透明大页(Transparent Huge Pages)。大页是预分配的方式管理,透明大页是动态分配的方式。我们可以使用这个参数-XX:+UseTransparentHugePages 来使用 transparent huge pages .对延迟要求很高的程序而言,这个参数是不推荐使用的,它可能会造成不必要的延迟峰值。
2.4.6 配置NUMA的支持
NUMA(非一致性内存访问)是Intel为了解决SMP多CPU结构中中线访问方式中资源竞争和一致性问题引起的。ZGC支持NUMA,此特性是默认开启的,它可以自主判断系统是否支持NUMA。如果在支持NUMA的机器上运行,那么将有显著的性能提升