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