Java中的引用变量是否有任何大小?

时间:2011-10-11 18:25:25

标签: java c

在C ++中我们使用sizeof()运算符,我们可以在Java中使用哪个函数来检查对象的大小?

我的基本疑问是java中的引用变量是否有任何大小。请考虑以下示例:

SampleClass obj = new SampleClass();

在这里,obj会有任何尺寸吗?如果是,我们如何在Java中检查它?

4 个答案:

答案 0 :(得分:3)

obj是一个变量,而不是一个对象。 obj是一个引用 - 可能是4或8个字节,具体取决于JVM。

值引用的对象的大小依赖于JVM。由于几个对象可以互相引用,因此以任何特别有用的方式讨论Java中对象的大小通常很棘手......通常重要的是,如果特定对象有资格获得垃圾,可能会有多少内存可用集合,这取决于第一个对象引用的其他对象 - 以及是否还有其他对象引用它们。

显然,对象的“原始”大小也有些重要,并且至少有点更容易预测(至少近似),但它仍然是特定于VM的,不能在执行时很容易被要求。 (您可以创建数百万个对象,防止它们被垃圾收集,并测量内存差异,但这是我所知道的,至少在调试器API之外。)

答案 1 :(得分:2)

由于您发现我的评论非常棒,我只需将其作为答案发布,尽管它可能对已有的答案非常有用:

请放心,参考变量(如obj)有一个大小,虽然这个大小的大小没有平台无关的答案,但肯定应该有一个大小。但是由于这种平台(或JVM)的依赖性,Java并不是混淆这种低级细节的语言。

也许编译器可以优化一些参考变量,因为它们只是别人的别名,但通常obj必须有一个大小,因为它必须以某种方式存储引用(不管这是什么,它是什么和不是没有。)

答案 2 :(得分:1)

obj仅是对SampleClass

实例的引用

SampleClass实例在内存中占用的大小取决于对象文件和VM的元素。但即使是参考文献当然需要一些记忆(如c)

但是java内存模型要复杂得多。如果您真的对该对象需要多少内存感兴趣,那么我强烈建议您使用内存分析器。

无论如何:因为java是一个VM而Java VM有垃圾收集器,所以通过计算(生存的)java对象和VM的内存,你期望的内存大小之间没有真正的1:1关系。从操作系统中分配。

答案 3 :(得分:0)

您可以尝试使用freeMemory类的Runtime方法了解引用的“大小”。 例如,分配一个包含1000000个空引用的数组:

SampleClass[] array = new SampleClass[1000000];

检查前后的空闲内存;差异可能暗示你想知道什么(数组本身是一个对象,虽然它的大小可能远小于1000000,所以测量必须非常精确)。