[英]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个布尔值,则在同一对象中找到它们是一回事,而如果它们分散在多个对象中则是另一回事(由于对齐导致过多的空间使用) 。 可以将这个逻辑实现为另一个访问者 (类似于MemoryMeasurer和ObjectGraphMeasurer的实现方式-就像您可能看到的一样简单),但是我没有打扰,因为那是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.