当并非所有使用的堆都可以从线程访问时查找Java内存泄漏

 手机用户2602914917 发布于 2023-02-09 19:22

我正在研究一个基于Java的大系统中潜在的内存泄漏(或至少是内存浪费).JVM的最大堆大小为5 GB,并且2-3GB堆使用量是应用程序的预期基线.(可能有更高的峰值)

在一个重载场景中,我正在调查堆被填满.使用"Eclipse MemoryAnalyzer Tool"分析堆转储显示(毫不奇怪)堆已完全用完.

MAT显示了两个潜在的泄漏候选者,两者大致保留了2.5GB:java.lang.Thread和系统中的域对象,该对象在系统中的事务处理期间广泛使用.但是,从Thread实例可以访问所有这些域对象(不足为奇).毕竟,这些线程正在处理事务.因此,归因于java.lang.Thread的2.5 GB几乎完全是由那些域对象引起的.这里不足为奇.

列出所有java.lang.Thread实例的对象树并总结所有线程的保留堆会导致2.5 GB的保留堆.

如果无法从java.lang.Thread实例访问堆,那么我应该在哪里寻找填充堆所需的其他2.5 GB? - 终结器队列中没有任何内容 - 没有大量无法访问的对象等待GC

我认为另一种提出这个问题的方法是:"如何找到所有从java.lang.Thread实例无法访问的对象?可能是一个OQL查询?",另一个问题是:"那里有什么样的对象无法从java.lang.Thread的实例到达终结器队列中的对象和待处理GC的未引用对象吗?"

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有