在C ++中我们使用sizeof()
运算符,我们可以在Java中使用哪个函数来检查对象的大小?
我的基本疑问是java中的引用变量是否有任何大小。请考虑以下示例:
SampleClass obj = new SampleClass();
在这里,obj
会有任何尺寸吗?如果是,我们如何在Java中检查它?
答案 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,所以测量必须非常精确)。