https://apistore.top 开源电商支付系统,欢迎加入转发。
https://cloud.tencent.com/developer/article/1829759
本地缓存设置时间过长,会造成无法Yang Gc, 当超过一定次数YongGc都无法回收对象时, JVM就会将对象归类到老年代中,当撑满老年代内存后,最终通过FullGc完成回收。由于老年代内存较大,fullGC时间就会比较久(遍历所有可达数据),而且JVM会暂停所有线程,如果大并发来临就会造成超时的问题。所以JVM调优就是让JVM避免或者减少FullGc的次数,降低Gc的时间。
Java堆 = 老年代 + 新生代
新生代 = Eden + S0 + S1
当 Eden 区的空间满了, Java虚拟机会触发一次 Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到 Survivor区。
大对象(需要大量连续内存空间的Java对象,如那种很长的字符串)直接进入老年态;
如果对象在Eden出生,并经过第一次Minor GC后仍然存活,并且被Survivor容纳的话,年龄设为1,每熬过一次Minor GC,年龄+1,若年龄超过一定限制(CMS默认是6次,最大15次PrintTenuringDistribution可以看出),则被晋升到老年态。即长期存活的对象进入老年态。
老年代满了而无法容纳更多的对象,Minor GC 之后通常就会进行Full GC,Full GC 清理整个内存堆 – 包括年轻代和年老代。
Major GC 发生在老年代的GC,清理老年区,经常会伴随至少一次Minor GC,比Minor GC慢10倍以上。
增加MaxTenuringThreshold,可以降低进入老年代的几率(不是绝对的,如果你的对象一直都不会回收的情况),但是会占用更多的Survivor,而且S0和S1来回复制的对象也更多,所以YongGc的时间会增长。
-server -Xmx12336M -Xms12336M -Xmn4096M -Xss1024k
-XX:MetaspaceSize=256M
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+DisableExplicitGC
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+ScavengeBeforeFullGC
-XX:+CMSParallelRemarkEnabled
-XX:+CMSClassUnloadingEnabled
-XX:+ExplicitGCInvokesConcurrent
-Xloggc:gc.log //记录gc日志
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC
-XX:+HeapDumpOnOutOfMemoryError --当OutOfMemoryError发生时自动生成Heap Dump文件。
-XX:HeapDumpPath=./logs
-XX:+HeapDumpBeforeFullGC -- 当JVM执行FullGC前执行 dump。
-XX:+HeapDumpAfterFullGC -- 当JVM执行FullGC后执行 dump。
-XX:-OmitStackTraceInFastThrow -javaagent:/root/middleware/tracking/lib/sandbox-agent.jar=server.port=8820\;server.ip=0.0.0.0
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
-jar app.jar
-server
-Xmx5144M
-Xms5144M
-Xmn2048M
-Xss1024k
-Xloggc:gc.demo.log //打印gc日志
-XX:+UseParNewGC
-XX:MetaspaceSize=256M
-XX:+UseConcMarkSweepGC
-XX:+DisableExplicitGC
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+ScavengeBeforeFullGC -XX:+CMSParallelRemarkEnabled
-XX:+CMSClassUnloadingEnabled
-XX:+ExplicitGCInvokesConcurrent
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintTenuringDistribution //输出显示在survivor空间里面有效的对象的岁数情况
-XX:MaxTenuringThreshold=15 //15次yong gc后放入老年代,6次默认值
-XX:-OmitStackTraceInFastThrow