在年轻代中经过GC 后还存活的对象会被复制到老年代中。当老年代空间不足时,JVM会对老年代进行完全的垃圾回收(full GC)。如果GC后,还是无法存放从 Survivor去复制过来的对象,就会出现 OOM(Out of Memory)
OOM 异常常见的原因
-
老年代内存不足
java.lang.OutOfMemoryError:Javaheapspace -
永久代内存不足
java.lang.OutOfMemoryError:PermGenspace -
代码BUG,占用内存无法及时回收
OOM在几个内存区都有可能出现,实际遇到OOM时,能根据异常信息定位到哪个区的内存溢出。可以通过添加参数 -XX:+HeapDumpOnOutMemoryError
,让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后分析
java启动调优配置
JAVA_OPTS="-server -Xms512m -Xmx2g -XX:+UseG1GC -XX:SurvivorRatio=6 -XX:MaxGCPauseMillis=400 -XX:G1ReservePercent=15 -XX:ParallelGCThreads=4 -XX:
ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=40 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:../logs/gc.log"
网友评论