在Java中为一个Integer对象分配了多少内存? 如何找出任何自定义对象的这个值?

测量堆中的内存应该用于创建某种类型的新对象的正确方法是什么(让我们谈谈Integers以保持简单)?

没有实验可以计算出这个值吗? 那种情况下的规则是什么? 这些规则是在某处严格规定的还是从jvm到jvm不等?

它可能因JVM而异。

您可能喜欢Oracle工程师发布的这篇博文 :

对于32位热点JVM上的Java Integer,32位有效负载(Integer.value字段)附带96个附加位,一个标记,一个klass和一个对齐填充字,用于总共128位。 此外,如果世界上有(例如)六个对此整数的引用(线程加堆),那些引用也占用192位,总共320位。 在64位机器上,一切都是两倍大,至少在目前:对象中的256位(现在包括96位填充)和其他地方的384位。 相比之下,未装箱的原始整数的六个副本占用192位

你可能想看看Java工具来找到它。 这是一个相同的例子。

在您的情况下,我相信您希望通过应用程序查找对象的大小,您将使Instrumentation对象全局可用( static ),以便您可以从应用程序访问它。

代码从链接复制

 public class MyAgent { private static volatile Instrumentation globalInstr; public static void premain(String args, Instrumentation inst) { globalInstr = inst; } public static long getObjectSize(Object obj) { if (globalInstr == null) throw new IllegalStateException("Agent not initted"); return globalInstr.getObjectSize(obj); } } 

但是,我相信你将能够找到只有对象的大小(不是原始类型,你也不需要找到它们,因为你已经知道了它们:-))

请注意,getObjectSize()方法不包括传入的对象引用的其他对象使用的内存。例如,如果对象A具有对对象B的引用,则对象A的报告内存使用量将仅包括所需的字节数。引用对象B(通常是4个字节),而不是实际对象。

要获得对象的内存使用量的“深度”计数(即包括“子对象”或“主”对象引用的对象),则可以使用可从此站点下载beta的Classmexer代理。

这在Java中并不容易: sizeof不存在,并且替代解决方案(例如将对象序列化为字节流并查看结果流的长度)在所有情况下都不起作用(例如字符串)。

但是,使用对象图看到这个相当复杂的实现 。