You might recollect "Java Tip 130: Do You Know Your Data Size?" that described a technique based on creating a large number of identical class instances and carefully measuring the resulting increase in the JVM used heap size. When applicable, this idea works very well, and I will in fact use it to bootstrap the alternate approach in this article.
# 1 楼答案
如果您需要相当准确,请查看Instrumentation framework
# 2 楼答案
This one是我使用的。一定很喜欢那些16字节的引用! 阿尔法克斯。国际商用机器公司治疗仪
# 3 楼答案
它可能因JVM而异,但"Sizeof for Java"表示
# 4 楼答案
从字面上看,在大多数JVM上,32位JVM上的所有引用都需要4个字节,一个64位JVM,一个引用需要8个字节,除非使用了-XX:+UseCompressedOops,在这种情况下需要4个字节
我想你是在问如何判断一个物体占据了多少空间。你可以使用仪器(不是一件简单的事情),但这只会给你一个很浅的深度。java倾向于将你分解成许多对象,C++是一个单一的结构,所以它不是有用的。p>
但是,如果您有内存问题,我建议您使用内存分析器。这将为您提供浅空和深空物体使用情况,并为您提供整个系统的图片。这通常更有用,因为你可以从最大的消费者开始,并对他们进行优化,即使你已经开发Java十年了+除非你有硬数据,否则你只能猜测哪里是最佳优化的地方
如果不想使用探查器,获取对象大小的另一种方法是分配一个大数组并查看消耗了多少内存,您必须多次这样做才能很好地了解平均大小。我会将young空格设置得很高,以避免GCs混淆您的结果,例如
-XX:NewSize=1g