我正在分析我的程序的内存使用情况,我意识到它正在使用 50 mb 的内存......它可能需要这一切来做什么?(程序相当简单,它不是 hello world,但它只有 937 个非空白行)。所以我把它放到 jhat 中,我得到了很多信息,这些信息并没有表明所有这些 Integer、Character 和 Byte 数组的引用。
这是显示最大内存消耗的图像:
当你点击 时class[I
,有很多看起来像这样的东西:
在近 5000 个实例计数中,大部分内存使用量在最大的 22 个数组中(我使用 excel 计算出来),其中 15 个的大小为 2677104。它们似乎是几乎完全为零的数组,如下所示:
来自根集的参考链什么也没提供。单击“从此处可访问的对象”并没有提供任何有用的信息,我认为:
什么在使用这个内存?我正在使用以下库:netty 3.6.5、mbassador 1.1.7、guice 3.0、guava 14.0.1、logback 1.0.11、joda-time 2.1、gson 2.2.3。
更新:我在 Eclipse MAT 中运行完全相同的堆转储并得到不同的结果......
我想知道这些大型数组是否已安排用于 GC 并且 MAT 是否将它们过滤掉?也许我分析我的程序太早了......“大约 97% 的时间:过早的优化是万恶之源” - Donald Knuth