本文链接:https://blog.csdn.net/a15939557197/article/details/90635460
背景
前段时间有一个这样的需求:第三方调用接口,30分钟内调用120W次;
物理机(与线上配置一样)上压测,第一次压了20w次,没有出现问题;接着又压了20w次,出现了内存溢出问题。
java.lang.OutOfMemoryError: Metaspace
JVM配置
JAVA_OPT_MEM="
-server -Xms4096M -Xmx4096M -Xmn512M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M
-XX:+UseParNewGC //新生区使用CMS(标记清理)算法进行垃圾回收
-XX:+UseConcMarkSweepGC //新生代使用并行收集器,老年代使用 CMS+串行收集器
...
...
"
初始化最大元空间是512M,
增加两个参数,在Full GC前后分别对内存做一个heap dump
-XX:+HeapDumpBeforeFullGC
-XX:+HeapDumpAfterFullGC
观察GC日志
{Heap before GC invocations=2799 (full 1):
par new generation total 471872K, used 58664K [0x00000006c0000000, 0x00000006e0000000, 0x00000006e0000000)
eden space 419456K, 9% used [0x00000006c0000000, 0x00000006c2679e10, 0x00000006d99a0000)
from space 52416K, 36% used [0x00000006dccd0