1。解决问题的初步思路
发生了OOM,必然说明系统中某个区域的对象太多了,塞满了那个区域,而且一定是无法回收的对象,最终导致内存溢出。
2。保存现场
在OOM时候保存一份内存快照,事后分析内存快照,检查那些对象占用了内存无法释放。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/user/local/oom
第一参数意思在OOM的时候自动dump内存快照出来
第二参数是把内存快照放到哪去
3。JVM参数模板---4核8G
-Xms4096M 初始堆大小
-Xmx4096M 堆最大值
-Xmn3072M 堆年轻代大小
-Xss1M 设置线程栈大小
-XX:MetaspaceSize=256M metaspace的大小
-XX:MaxMetaspaceSize=256M metaspace的最大大小
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFaction=92 CMS垃圾收集器,当老年代达到92%时,触发CMS垃圾回收
-XX:+UseCMSCompactAtFullCollection 打开对老年代的压缩,可能会影响性能,但可以消除堆碎片
-XX:CMSFullGCsBeforeCompaction=0 每次CMS GC后对堆空间进行压缩、整理
-XX:+CMSParallelInitiaMarkEnabled 初始标记并行执行
-XX:+CMSScavengeBeforeRemark 在Full GC之前触发一次Young GC
-XX:+DisableExplicitGC 禁止使用System.gc
-XX:+PringGCDetails 开启GC日志
-Xloggc:gc.log 日志文件输出路径
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/user/local/oom
参考自:狸猫技术窝