繁体   English   中英

Java对象内存使用情况-IBM ivm 1.4.2

[英]Java Object memory usage - ibm jvm 1.4.2

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

我想让对象内存使用率成为应用程序运行时调试输出的一部分。 我不想使用外部应用程序连接到VM。

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

编辑:我正在使用Java 1.4:/

参见我的宠物项目MemoryMeasurer 一个小例子:

long memory = MemoryMeasurer.measureBytes(new HashMap());

您还可以得出更多定性的内存故障信息:

Footprint footprint = ObjectGraphMeasurer.measure(new HashMap());

例如,我使用后者来推导各种数据结构每次输入成本 ,其中开销是根据创建的对象,引用和基元的数量而不是字节(也可以)来衡量的。 因此,下次使用(默认) HashSet ,您会被告知,其中的每个元素花费1个新对象(不是您的元素),5个引用和一个int,这与HashMap的条目的花费完全相同(并不奇怪,因为任何HashSet元素都以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 + ...;

那给你一个近似值。 更好的答案是将其设置为最接近的16的倍数:

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

但是答案可能仍然是错误的,因为如果您发现例如16个布尔值,则在同一对象中找到它们是一回事,而如果它们分散在多个对象中则是另一回事(由于对齐导致过多的空间使用) 。 可以将这个逻辑实现为另一个访问者 (类似于MemoryMeasurerObjectGraphMeasurer的实现方式-就像您可能看到的一样简单),但是我没有打扰,因为那是Instrumentation工作,所以它只对低于1.5的Java版本有意义。

Eclipse MAT是一个非常好的分析内存的工具。

jdk附带了一些工具,例如jmap和jhat,它们提供了对象级别的详细信息。

以下链接提供了一段Java代码,用于计算对象的大小:

http://www.javaworld.com/javaworld/javatips/jw-javatip130.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM