场景1:Full GC时间太长
(1)降低堆内存大小。这样能增加full gc的次数,但每次full gc的时间会降低
(2)定时出发full gc。如果full gc的频率不高,如十几个小时才触发一次,则可以考虑做个定时器,显式地调用System.gc()进行full gc。
场景2:经常发生OutOfMemory内存溢出
(1)java.lang.OutOfMemoryError: Java heap space
可以参考我的另一篇文章java虚拟机java.lang.OutOfMemoryError系列之Java heap space解决思路
(2)调整直接内存大小。这种情况java堆内存够用,但整个服务器内存溢出,可能是NIO的一些用法会导致分配了过多的堆外内存,即直接内存。可以通过降低直接内存大小来防止这个情况。具体方法为调整-XX:MaxDirectMemorySize
场景3:虚拟机经常崩溃
(1)检查调用外系统是否有大量线程等待。若外系统响应时长较长,则本系统会积压大量未结束的请求,超过虚拟机承受能力而导致崩溃。