JVM参数配置

-server -Xms4g -Xmx4g -Xmn2g

堆内存最大和最小一样4g,年轻代内存2g

-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m

元空间区(Matespace)或永久代(Permanent Generation),类比于是方法区
https://blog.csdn.net/wangyili002/article/details/105584663
MetaspaceSize
表示的并非是元空间的大小,它的含义是:主要控制matesaceGC发生的初始阈值,也就是最小阈值。也就是说当使用的matespace空间到达了MetaspaceSize的时候,就会触发Metaspace的GC

-XX:MaxDirectMemorySize=1g

– Direct ByteBuffer分配的堆外内存到达指定大小后,即触发Full GC

-XX:SurvivorRatio=10

设置新生代中eden和S0/S1空间的比例 默认
-XX:SurvivorRatio=8,Eden:S0:S1=8:1:1 假如
-XX:SurvivorRatio=4,Eden:S0:S1=4:1:1 SurvivorRatio值就是设置Eden区的比例占多少,S0/S1相同

-XX:+UseConcMarkSweepGC

–使用的是 cms垃圾收集器

-XX:CMSMaxAbortablePrecleanTime=5000

CMS垃圾回收的6个重要阶段

  1. initial-mark 初始标记(CMS的第一个STW阶段),标记GC Root直接引用的对象,GC Root直接引用的对象不多,所以很快。
  2. concurrent-mark 并发标记阶段,由第一阶段标记过的对象出发,所有可达的对象都在本阶段标记。
  3. concurrent-preclean 并发预清理阶段,也是一个并发执行的阶段。在本阶段,会查找前一阶段执行过程中,从新生代晋升或新分配或被更新的对象。通过并发地重新扫描这些对象,预清理阶段可以减少下一个stop-the-world
    重新标记阶段的工作量。
  4. concurrent-abortable-preclean 并发可中止的预清理阶段。这个阶段其实跟上一个阶段做的东西一样,也是为了减少下一个STW重新标记阶段的工作量。增加这一阶段是为了让我们可以控制这个阶段的结束时机,比如扫描多长时间(默认5秒)或者Eden区使用占比达到期望比例(默认50%)就结束本阶段。
  5. remark 重标记阶段(CMS的第二个STW阶段),暂停所有用户线程,从GC Root开始重新扫描整堆,标记存活的对象。需要注意的是,虽然CMS只回收老年代的垃圾对象,但是这个阶段依然需要扫描新生代,因为很多GC
    Root都在新生代,而这些GC Root指向的对象又在老年代,这称为“跨代引用”。
  6. concurrent-sweep ,并发清理。 原文链接:https://blog.csdn.net/flysqrlboy/article/details/88679457
    -XX:CMSMaxAbortablePrecleanTime=5000 ,默认值5s,代表该阶段最大的持续时间(第四阶段)

-XX:+CMSClassUnloadingEnabled

这个参数表示在使用CMS垃圾回收机制的时候是否启用类卸载功能。默认这个是设置为不启用的,所以你想启用

-XX:ParallelGCThreads=4

-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

-XX:+UseAsyncGCLog

使用gc log

-Xloggc:/home/admin/logs/gc.log

gc日志文件路径

-XX:+PrintGCDetails

输出对应的格式

-XX:+PrintGCDateStamps

输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]

-XX:+HeapDumpOnOutOfMemoryError

参数表示当JVM发生OOM时,自动生成DUMP文件

-XX:HeapDumpPath=/home/admin/logs/java.hprof

生成dump文件对应的路径

常见配置汇总

  1. 堆设置
    ○ -Xms:初始堆大小
    ○ -Xmx:最大堆大小
    ○ -XX:NewSize=n:设置年轻代大小
    ○ -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
    ○ -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
    ○ -XX:MaxPermSize=n:设置持久代大小
  2. 收集器设置
    ○ -XX:+UseSerialGC:设置串行收集器
    ○ -XX:+UseParallelGC:设置并行收集器 (新生代)
    ○ -XX:+UseParalledlOldGC:设置并行年老代收集器
    ○ -XX:+UseConcMarkSweepGC:设置并发收集器
  3. 垃圾回收统计信息
    ○ -XX:+PrintGC
    ○ -XX:+PrintGCDetails
    ○ -XX:+PrintGCTimeStamps
    ○ -Xloggc:filename
  4. 并行收集器设置
    ○ -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
    ○ -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
    ○ -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
  5. 并发收集器设置
    ○ -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
    ○ -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
    在这里插入图片描述

调优总结

  1. 年轻代大小选择
    ○ 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
    ○ 吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。
  2. 年老代大小选择
    ○ 响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得: 减少年轻代和年老代花费的时间,一般会提高应用的效率
    ■ 并发垃圾收集信息
    ■ 持久代并发收集次数
    ■ 传统GC信息
    ■ 花在年轻代和年老代回收上的时间比例
    ○ 吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。
  3. 较小堆引起的碎片问题
    因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
    ○ -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
    ○ -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩
    参考链接:https://www.cnblogs.com/likehua/p/3369823.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值