我正在尝试获取正在运行的 JVM 中某个类的所有实例的平均大小。我可以使用 jcmd 或类似工具创建堆转储,但这需要几秒钟,这是一个生产服务器,所以我宁愿有更快的东西。jcmd 有一个选项可以创建这种格式的直方图:
num #instances #bytes class name
----------------------------------------------
1: 84907 559415720 [I
2: 9572537 229740888 java.lang.String
3: 803323 142900392 [C
4: 3190710 102102720 java.util.Hashtable$Entry
这似乎很有希望,但我认为字节大小是浅的而不是保留的内存。有没有办法创建具有保留大小的相同直方图?或者也许是另一种快速获取类实例平均大小的方法?
我知道 GDB 方法,但它不适合,因为命令序列将花费我几秒钟的时间来输入,而这大约是使用 jcmd 进行堆转储所需的时间。