PermGen OutOfMemory问题排查

一、问题现象

某个服务接口报超时告警,查看应用日志,发现大量PermGen OutOfmemory,怀疑是Perm区内存不足,使用jmap -heap <pid>,查看JVM Perm区分配情况,发现Perm区设置了最大80M,使用率接近100%。

使用jmap -dump:live,format=b,file=/tmp/heap.hprof <pid>导出JVM堆内存信息,查看堆内存发现有很多JSONObject。

二、解决方案

  • 临时提高PermSize和MaxPermSize参数,-XX:PermSize,-XX:MaxPermSize
  • 进行代码优化,减少动态类生成,如果必要进行动态类生成的,注意避免不必要的引用,因为不必要的引用会导致无法被垃圾回收。

三、原理分析

Perm区在JVM中主要存储类的相关信息,例如静态变量、方法信息等,除了JVM启动时加载的类信息,通过反射生成的动态类信息也会存放在这个区域,而这恰恰经常是容易忽略的点。

Perm区也是受垃圾收集控制的,当加载类的类加载器实例变为不可达时,其加载的类型将会被垃圾收集回收释放。


上一篇:Builder模式


下一篇:typora+PicGo+github搭建程序员必备创作环境