为什么会堆内存溢出

在年轻代中经过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"
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容