4

我有一个通过 Jmap 获取的对象堆转储。我还通过 Jhat 看到了转储。我需要计算对象的大小。我该怎么做?

在转储中,我可以看到例如:

Class Name,                    total objects,          total size
com.test.app.CallRecord ,             2194       ,            446324

所以如果我计算 446324/2194 = 203。所以 203 字节是 1 个 CallRecord 对象的大小。是这样吗?我在这里有一个困惑。这个尺寸是多少?它是否也包括参考的大小?

我很困惑。有人要求我让他们知道 CallRecord 对象的大小。我应该告诉他们 203 个字节吗?我不知道它是否正确。

203 字节是否包括引用的大小也属于 CallRecord 对象?

如何计算?

4

2 回答 2

2

我建议您使用某种内存分析工具(分析器)。YourKit 非常适合,但价格昂贵,Eclipse MAT 也不错,而且它是免费的。VisualVM 非常简单,但它也足够好而且免费......(我经常最终使用它们,因为它们都有一些其他缺乏的东西......)

于 2012-09-06T10:12:07.853 回答
2

这取决于总尺寸是尺寸还是保留尺寸。

  1. 浅尺寸

    对象的浅大小是用于存储对象本身的内存量。不考虑引用的对象。

  2. 保留尺寸

    对象的保留大小是垃圾收集器收集对象时可以释放的内存量。

于 2012-09-06T10:23:38.500 回答