-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个重要阶段
- initial-mark 初始标记(CMS的第一个STW阶段),标记GC Root直接引用的对象,GC Root直接引用的对象不多,所以很快。
- concurrent-mark 并发标记阶段,由第一阶段标记过的对象出发,所有可达的对象都在本阶段标记。
- concurrent-preclean 并发预清理阶段,也是一个并发执行的阶段。在本阶段,会查找前一阶段执行过程中,从新生代晋升或新分配或被更新的对象。通过并发地重新扫描这些对象,预清理阶段可以减少下一个stop-the-world
重新标记阶段的工作量。- concurrent-abortable-preclean 并发可中止的预清理阶段。这个阶段其实跟上一个阶段做的东西一样,也是为了减少下一个STW重新标记阶段的工作量。增加这一阶段是为了让我们可以控制这个阶段的结束时机,比如扫描多长时间(默认5秒)或者Eden区使用占比达到期望比例(默认50%)就结束本阶段。
- remark 重标记阶段(CMS的第二个STW阶段),暂停所有用户线程,从GC Root开始重新扫描整堆,标记存活的对象。需要注意的是,虽然CMS只回收老年代的垃圾对象,但是这个阶段依然需要扫描新生代,因为很多GC
Root都在新生代,而这些GC Root指向的对象又在老年代,这称为“跨代引用”。- 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文件对应的路径
常见配置汇总
- 堆设置
○ -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:设置持久代大小 - 收集器设置
○ -XX:+UseSerialGC:设置串行收集器
○ -XX:+UseParallelGC:设置并行收集器 (新生代)
○ -XX:+UseParalledlOldGC:设置并行年老代收集器
○ -XX:+UseConcMarkSweepGC:设置并发收集器 - 垃圾回收统计信息
○ -XX:+PrintGC
○ -XX:+PrintGCDetails
○ -XX:+PrintGCTimeStamps
○ -Xloggc:filename - 并行收集器设置
○ -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
○ -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
○ -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) - 并发收集器设置
○ -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
○ -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
调优总结
- 年轻代大小选择
○ 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
○ 吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。 - 年老代大小选择
○ 响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得: 减少年轻代和年老代花费的时间,一般会提高应用的效率
■ 并发垃圾收集信息
■ 持久代并发收集次数
■ 传统GC信息
■ 花在年轻代和年老代回收上的时间比例
○ 吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。 - 较小堆引起的碎片问题
因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
○ -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
○ -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩
参考链接:https://www.cnblogs.com/likehua/p/3369823.html