内存泄漏问题排查

项目引入:某个功能页面一直打开进行静态拷机,发现内存持续增长。

可以通过JConsole监测内存增长曲线:

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=YOUR_PORT

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

-Djava.rmi.server.hostname=YOUR_SERVER_IP

然后输出一下堆内存快照,通过MAT进一步分析:

jmap: jmap -dump:live,format=b,file=<filename>.hprof <pid>

jcmd: jcmd <pid> GC.heap_dump <filename>.hprof

同时查看一下Full GC频率:

jstat -gc <pid> interval count

  • S0C 和 S1C:Survivor区0和Survivor区1的当前容量(字节)。
  • S0U 和 S1U:Survivor区0和Survivor区1的已用空间大小。
  • EC 和 EU:Eden区的当前容量及其已用空间大小。
  • OC 和 OU:老年代的当前容量及其已用空间大小。
  • MC 和 MU:Metaspace的当前容量及其已用空间大小(在Java 8及以上版本中,永久代被Metaspace取代)。
  • CCSC 和 CCSU:压缩类空间的当前容量及其已用空间大小。
  • YGC 和 YGCT:年轻代GC事件的总次数及其总耗时(秒)。
  • FGC 和 FGCT:Full GC事件的总次数及其总耗时(秒)。
  • GCT:所有GC事件的总耗时(秒),等于YGCT加FGCT

MAT打开Heap Dump文件,查看Dominator Tree的引用链,哪个对象占用对空间最大

经分析,最终定位到2处泄漏的地方:一处是 JNI回调方法中,由于这些方法被频繁地调用,处理JNI对象时候生成了部分局部引用一直被占用未被释放;另一处是一个静态Map一直被占用,处理LRUCache的数据并存放到Map,由于size过大还没处理完又不断有新请求进来,强引用太多,调用方法阻塞。

除修改泄漏处代码外,调整了部分JVM参数,如下:

// 设置G1垃圾收集器触发一次混合垃圾回收周期时整个堆占用率的阈值

-XX:InitiatingHeapOccupancyPercent=25

// G1启用字符串去重功能以减少内存占用

-XX:+UseStringDeduplication

// 设置G1垃圾收集器允许的最大堆浪费比例

-XX:G1HeapWastePercent=10

**//**设置应该预留的堆空间百分比

-XX:G1ReservePercent=20

-XX:ParallelRefProcEnabled

******//******设置尝试达到的目标最大GC停顿时间

-XX:MaxGCPauseMillis=100

// 设置 Eden 区与单个 Survivor 区的比例

-XX:SurvivorRatio=6

****//****设置 Minor GC 后 Survivor 区(To Space)预期的占用比例

-XX:MaxTenuringThreshold=15
相关推荐
星恒随风4 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
秋饼5 小时前
GPT-Live 全双工语音 API Java 服务端落地实战:事件协议、会话恢复与生产踩坑
java·ai·技术分享·后端开发
SL_staff5 小时前
为什么企业级自动化不能只靠AI编排?——逻辑引擎在确定性业务场景中的不可替代性
java·开源·产品
时间的拾荒人6 小时前
Redis 集合类型详解:Set 与 Zset
redis·缓存·面试
Pniubi6 小时前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql
陈希1237 小时前
Linux 网络诊断工具实战:ping、curl、tcpdump、mtr、dig 用法详解
linux·网络·tcpdump
进击的荆棘7 小时前
Linux系统——线程同步与互斥之线程池和安全
linux·运维·服务器·安全·单例模式·线程
松仔log7 小时前
Kotlin中级——callbackFlow
java·前端·kotlin
刘大望7 小时前
不用买开发板:用 QEMU 走通嵌入式 Linux 全流程(三)存储与网络实地验证
linux·qemu·嵌入式linux·alpine
知守观7 小时前
同一个团队两套分包:DDD 四层落地后,domain 层最大的类还是 5885 行
java·后端·领域驱动设计