在Java中如何测试对象引用占用多少字节?

8
我想测试在我使用的Java虚拟机中一个对象引用使用了多少字节。你们知道如何测试吗?
谢谢!

1
我只是猜测,但为什么不编写一个0字节分配的程序,只是循环以建立基线,然后分配100,000(如有需要则为1百万)个相同类型的对象。大小上的差异可能是一个合理的估计。欢迎Java大师们推翻这个想法;-) - shellter
@Shelter:使用现代操作系统、JVM和GC,结果可能会过于细粒度而无法提供有用的信息。 - Lawrence Dol
到目前为止,你得到的答案似乎都是关于对象大小的。然而,你的问题明确指出了对象“引用”大小。如果你确实在寻找引用大小,那么请参考https://dev59.com/gnNA5IYBdhLWcg3wZ81R - WhiteFang34
4个回答

13
字面上理解,大多数JVM上,32位JVM上的所有引用占用4个字节,而64位JVM上,一个引用占用8个字节,除非使用了-XX:+UseCompressedOops,在这种情况下,它占用4个字节。
我猜你是在问如何确定一个对象占用多少空间。你可以使用Instrumentation(不是简单的事情),但这只会给你浅层次的信息。Java倾向于将C++中的许多对象拆分成多个对象,因此它并不是很有用。
然而,如果你有内存问题,我建议你使用内存分析器。这将给你对象使用的浅层和深层空间,并为您提供整个系统的图像。这通常更有用,因为即使你已经开发Java十年以上,除非你有硬数据,否则你只能猜测最佳优化位置。
如果你不想使用分析器来获取对象大小,另一种方法是分配一个大数组并查看消耗的内存量,你必须多次执行此操作才能获得平均大小的良好估计值。我会将young space设置得非常高,以避免GC混淆你的结果,例如-XX:NewSize=1g

2

2
它可能因JVM而异,但"Java的Sizeof"说:

您可能会回忆起“Java Tip 130:了解您的数据大小?”这篇文章描述了一种基于创建大量相同类实例并仔细测量JVM使用堆大小的技术。当适用时,这个想法非常有效,事实上我将在本文中使用它来引导另一种方法。


1

这个是我使用的。必须喜欢那些16字节的引用!alphaworks.ibm.heapanalyzer


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接