gc补充
A、G1垃圾回收器的开始mixedGc的阈值 InitiatingHeapOccupancyPercent 默认是45%,这指的是已经使用内存(老年代+新生代)占整个堆的占比。 B、 G1MaxNewSizePercent 的默认值是60% C、G1垃圾回收期与之前的垃圾回收器的回收模型(和内存区域划分)如此不同,所以执行机制也很不同,执行一次ygc后,会计算是否达到 InitiatingHeapOccupancyPercent 如果达到,则触发 mixedGc 在ygc 后再判断的机制,导致实际的计算是:老年代使用/整个堆。 -XX:+UseConcMarkSweepGC 设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了。所以,此时年轻代大小最好用-Xmn设置。 -XX:+CMSParallelRemarkEnabled 开启并行收集 并行运行最终标记阶段,加快最终标记的速度 -XX:+CMSClassUnloadingEnabled 让CMS可以收集永久带,默认不会收集 -XX:SurvivorRatio 来控制Eden和Survivor的比例 -XX:SoftRefLRUPolicyMSPerMB 代表每一MB空闲内存空间可以允许SoftReference对象存活多久,不要设置 cms收集器 https://blog.csdn.net/mc90716/article/details/80158138 -XX:G1HeapRegionSize 大小影响分配和回收的效率,HR过大则回收消费的时间长,HR过小则导致对象内存分配较慢且内存利用率较低,大小主要是关系到Humongous Object的判定,当一个对象超过Region大小的一半时,则为巨型对象,那么其会至少独占一个Region 默认为2048 2的幂次 -XX:G1ReservePercent 指定G1为分配担保预留的空间比例,默认10%。也就是老年代会预留10%的空间来给新生代的对象晋升,如果经常发生新生代晋升失败而导致Full GC,那么可以适当调高此阈值。但是调高此值同时也意味着降低了老年代的实际可用空间 G1收集器 https://zhuanlan.zhihu.com/p/181305087 优点:分区可以有效利用内存空间 -XX:CMSInitiatingOccupancyFraction=70 和-XX:+UseCMSInitiatingOccupancyOnly 这两个设置一般配合使用,一般用于『降低CMS GC频率或者增加频率、减少GC时长』的需求 -XX:CMSInitiatingOccupancyFraction=70 是指设定CMS在对内存(老年代)占用率达到70%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC); -XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整. 所以可以根据应用程序的特点,对参数-XX:CMSInitiatingOccupancyFraction进行调优,比如如果内存增长的速率缓慢,那么可以把阈值设置的大些,这样就降低了CMS的触发频率,老年代回收次数也会减少,回收次数减少,STW的次数也就少了,应用程序的性能间接得到提升。如果内存增长的速率比较快,那么就要把阈值设置的小些,因为如果CMS在执行的过程中,由于内存增长过快,出现了内存不足的情况,CMS回收器就会回收失败,然后虚拟机就会启动备份的老年代串行回收器来做垃圾回收,此时整个应用程序就完全中断了,直到垃圾回收完成,所以要把阈值设置的小些,虽然因此提高了CMS的触发频率,但也提高了CMS回收的成功率,避免了老年代串行回收器被频繁触发。 -Xms4096M -Xmx4096M -Xmn256M -XX:+UseG1GC -XX:G1HeapRegionSize=8m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:gc -Xloggc:/wls/apache/servers/spri_pah-app-core-sportreward-sportawardsmall-prdDMZ135054/logs/gc.log -Xms12288M -Xmx12288M -XX:+UseG1GC -XX:G1HeapRegionSize=8m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:gc -Xloggc:/wls/apache/servers/spri_pah-app-core-insurance-service-dmz-prdIns267155/logs/gc.log -Xms4096M -Xmx4096M -Xmn256M -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:gc -Xloggc:/wls/apache/servers/spri_pah-app-core-insurance-service-dmz-big-prdIns680749/logs/gc.log -Xms4096M -Xmx4096M -Xmn256M -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -XX:+PrintGCDateStamps gc日志 2021-05-16T14:55:53.102+0800: 2153867.976: [GC (Allocation Failure) 2021-05-16T14:55:53.102+0800: 2153867.976: [ParNew: 210249K->403K(235968K), 0.0250728 secs] 330320K->120475K(4168128K), 0.0252330 secs] [Times: user=0.10 sys=0.00, real=0.03 secs] 2021-05-16T15:02:22.053+0800: 2154256.928: [GC (Allocation Failure) 2021-05-16T15:02:22.053+0800: 2154256.928: [ParNew: 210195K->382K(235968K), 0.0260395 secs] 330267K->120459K(4168128K), 0.0262224 secs] [Times: user=0.10 sys=0.00, real=0.03 secs]
G1的gc日志 总共4096M
2021-05-16T14:09:32.451+0800: 333419.229: [GC pause (G1 Evacuation Pause) (young), 0.0312402 secs]
[Parallel Time: 18.0 ms, GC Workers: 4]
[GC Worker Start (ms): Min: 333419233.2, Avg: 333419233.3, Max: 333419233.4, Diff: 0.2]
[Ext Root Scanning (ms): Min: 10.2, Avg: 13.6, Max: 17.0, Diff: 6.8, Sum: 54.3]
[Update RS (ms): Min: 0.0, Avg: 1.9, Max: 3.9, Diff: 3.9, Sum: 7.7]
[Processed Buffers: Min: 0, Avg: 35.0, Max: 99, Diff: 99, Sum: 140]
[Scan RS (ms): Min: 0.1, Avg: 0.8, Max: 1.5, Diff: 1.4, Sum: 3.1]
[Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.1]
[Object Copy (ms): Min: 0.5, Avg: 1.1, Max: 1.7, Diff: 1.2, Sum: 4.5]
[Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 0.9]
[Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4]
[GC Worker Other (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.2]
[GC Worker Total (ms): Min: 17.6, Avg: 17.7, Max: 17.8, Diff: 0.2, Sum: 70.7]
[GC Worker End (ms): Min: 333419251.0, Avg: 333419251.0, Max: 333419251.0, Diff: 0.0]
[Code Root Fixup: 0.0 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 2.1 ms]
[Other: 11.1 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 0.5 ms]
[Ref Enq: 0.0 ms]
[Redirty Cards: 0.2 ms]
[Humongous Register: 3.5 ms]
[Humongous Reclaim: 0.0 ms]
[Free CSet: 5.4 ms]
[Eden: 2454.0M(2454.0M)->0.0B(2454.0M) Survivors: 2048.0K->2048.0K Heap: 2530.2M(4096.0M)->76.2M(4096.0M)]
[Times: user=0.06 sys=0.00, real=0.04 secs]
解读:
[Eden: 2454.0M(2454.0M)->0.0B(2454.0M) Survivors: 2048.0K->2048.0K Heap: 2530.2M(4096.0M)->76.2M(4096.0M)] GC结果:Eden区减少2454.0M总共2454.0M
Eden区的GC之后,幸存的对象将被移动到 Survivor区
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。
不过元空间和永久代之间最大的区别在于:
元空间并不在虚拟机中,而是使用本地内存。
因此,默认情况下,元空间的大小仅受本地内存限制
如果jvm参数中设置了-XX:+DisableExplicitGC,那么代码中手动调用System.gc()就不会生效。而有些框架中因为是使用的堆外内存,必须手动调用System.gc()来释放。如果禁用掉就会导致堆外内存使用一直增长,造成内存泄露
内存溢出:(out of memory)通俗理解就是内存不够
内存泄漏:(Memory Leak) ,内存使用一直增长,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
hoose_gc_options()
{
# Example of JAVA_MAJOR_VERSION value : '1', '9', '10', '11', ...
# '1' means releases befor Java 9
JAVA_MAJOR_VERSION=$("$JAVA" -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p')
if [[ "$JAVA_MAJOR_VERSION" -lt "9" ]] ; then
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
else
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"
JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log:time,tags:filecount=5,filesize=30M"
fi
}