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

 

 

 

 

参考自:狸猫技术窝