Java对象内存使用情况 - ibm jvm 1.4.2

Gad*_*lin 4 java profiling memory-management

是否有可能在应用程序中找到java中对象的内存使用情况?

我希望在应用程序运行时将对象内存使用作为调试输出的一部分.我不想使用外部应用程序连接到VM.

我有一个问题,即很少有类占用大量内存并导致内存问题,我的应用程序崩溃了.我需要找到内存使用情况(我正在使用有限的内存资源).

编辑:我使用的是java 1.4:/

Dim*_*eou 6

看我的宠物项目MemoryMeasurer.一个很小的例子:

long memory = MemoryMeasurer.measureBytes(new HashMap());
Run Code Online (Sandbox Code Playgroud)

您还可以获得更多定性内存细分:

Footprint footprint = ObjectGraphMeasurer.measure(new HashMap());
Run Code Online (Sandbox Code Playgroud)

例如,我使用后者来导出各种数据结构每个条目成本,其中开销是以创建的对象的数量,引用和基元来衡量的,而不仅仅是字节(这也是可行的).因此,下次使用(默认)时HashSet,可以通知您其中的每个元素都需要1个新对象(不是您的元素),5个引用和一个int,这与条目的成本完全相同HashMap(并非出乎意料) ,因为任何HashSet元素都以a HashMap)结尾,依此类推.

您可以在任何对象图上使用它.如果您的对象图包含您希望忽略的其他结构的链接,则应使用谓词来避免探索它们.

编辑 Instrumentation不适用于Java 1.4(哇,人们仍然使用它?!),因此memoryBytes上面的调用对你不起作用.但第二个会.然后你可以写这样的东西(如果你在32位机器上):

long memory = footprint.getObjects() * 8 + footprint.getReferences() * 4 +
              footprint.getPrimitives().count(int.class) * 4 + 
              footprint.getPrimitives().count(long.class) * 8 + ...;
Run Code Online (Sandbox Code Playgroud)

这给你一个近似值.一个更好的答案是将其细化到16的最接近的倍数:

long alignedMemory = (x + 15) & (~0xF); //the last part zeros the lowest 4 bits
Run Code Online (Sandbox Code Playgroud)

但答案可能仍然是关闭的,因为如果你发现16个布尔值,那么如果它们存在于同一个对象中则是一回事,如果它们分布在多个对象中则是另一回事(并且由于对齐而导致过多的空间使用) .这个逻辑可以作为另一个访问者实现(类似于MemoryMeasurerObjectGraphMeasurer的实现方式 - 很简单,你可能会看到),但我没有打扰,因为那是什么Instrumentation,所以它只能理解1.5以下的Java版本.