如何查找堆中的对象数

jav*_*eek 20 java heap

如何在Java程序中找到堆上活动对象的数量?

Wil*_*ung 12

jmap是标准的java实用程序,可用于捕获堆转储和统计信息.我不能说jmap使用什么协议连接到JVM来获取这些信息,并且不清楚这些信息是否可以直接在JVM中运行的程序(虽然我确信程序可以查询它的JVM)通过一些套接字来获取此信息).

JVM TI是C代码使用的工具接口,它几乎可以完全访问JVM,但它是C代码,而不是JVM直接提供的.您可以编写一个C lib然后与它进行交互,但没有任何开箱即用的功能.

有几个JMX MBean,但我不认为它们中的任何一个提供实际的对象计数.您可以从这些获取内存统计信息(这些是JConsole使用的).查看java.lang.management类.

如果你想要一些快速(易于实现,不一定是一个快速的结果,因为jmap需要一些时间),我会分叉一段jmap,并只是读取生成的文件.


Bin*_*ang 7

使用jvisualvm,并做一个内存示例.它将显示类和实例的数量:

在此输入图像描述


Jak*_*ski 7

最简单的方法是使用jmap工具.如果您将在最后打印对象直方图,您将看到实例的总数以及所有对象的累积大小:

jmap -histo <PID>将打印具有实例数和大小的整个对象.最后一行将包含总数

Total 2802946 174459656

第二列是总实例数,最后一列是总字节数.


use*_*421 5

有一个黑客,你可以尝试:

  • 创建自己的java.lang.Object(复制原始源代码)
  • 计算构造函数中创建的对象(不为数组调用)
  • 将类文件的路径添加到引导类路径

请参阅此(旧)文章了解样本.

可能有更好的方法来使用JPDAJMX,但我还没有找到...

  • 1)注意:这个hack*可能会破坏你的JVM稳定性.2)我认为它不会通过反序列化对象流来计算"创建"的对象.(默认反序列化绕过对象构造函数.) (3认同)