现象
jdk1.8下 java进程启动
内存会随着运行 并发不断缓慢增加, 但不会释放下来。
第一阶段,认为有些对象没有造成内存溢出,开始各种分析。
之间使用一些工具命令,常用记录下来
一顿操作猛如虎,结果发现还是没有太大问题,顶多jetty 一些对象生命周期较长WebSocketSession MappedByteBufferPool
阿里软件工具 arthas java -jar arthas-boot.jar https://arthas.aliyun.com/doc java jmap -histo pid>histoxxx.txt 输出文本pid所有对象内存打下 jmap -heap pid jmap -dump:format=b,file=dump.hprof <pid> jstat -gcutil pid 总结垃圾回收统计 pmap -x 13367 | sort -n -k3 开启jvm port=$1 port2=$((10#${port}-1000)) -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=$port2 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=x.x.x.x
第二阶段 开始调优jvm,目标能够及时回收一些内存
设置一些 最大 最小 内存后 发现内存可以回收了,但是每次都是一段时间后通过FGC 来回收的,瞬间尴尬了。
开始更高端的jvm设置,.....
蓦然回首...
jdk8默认使用 并行收集器组合 Parallel Scavenge + Parallel Old
为什么不用G1呢
https://blog.csdn.net/coderlius/article/details/79272773可以看些回收机制概念
第三阶段,使用G1
G1回收器的常见操作步骤
G1的设计原则就是简化JVM性能调优,开发人员只需要简单的三步即可完成调优:
第一步: 开启G1垃圾收集器
第二步: 设置堆的最大内存
第三步: 设置最大的停顿时间
G1中提供了三种垃圾回收模式: YoungGC、Mixed GC和Full GC,在不同的条件下被触发。
一段时间观察 jstat -gcutil xx
FGC没有,内存也能下来了。 总结,一些第三方工具使用后,某些对象生命周期不定,
大并发下gc不一定能下来,新 旧区设置调优需要达到平衡。使用G1更智能简洁。