Java:找出对象的内存大小?

时间:2011-11-12 13:41:51

标签: java memory actionscript size byte

  

可能重复:
  In Java, what is the best way to determine the size of an object?

在Actionscript中我通常可以这样做:

var myVar:uint = 5;
getSize(myVar)
//outputs 4 bytes

我如何用Java做到这一点?

3 个答案:

答案 0 :(得分:3)

如果关闭-XX:-UseTLAB,可以在之前和之后检查Runtime.freeMemory()。但是在局部变量的情况下,它们不占用堆上的空间(因为它们使用堆栈)并且你无法获得它的大小。

但是,int是32位符号值,您可以预期它将使用4个字节(或更多,具体取决于JVM和堆栈对齐等)

C ++中的sizeof对指针算法很有用。由于Java不允许这样做,因此它没有用处并且可能是故意隐藏的,以避免开发人员担心低级别的细节。

答案 1 :(得分:1)

我认为没有直接的方法可以做到这一点。 @Peter Lawrey的建议可能是近似的。但是,您不能依赖于通过获取Object构建之前和之后的可用空闲内存之间的差异来计算对象大小,因为在其他线程中可能还有很多其他分配。此外,垃圾收集器可能会启动并在您的操作之间释放一些内存。另外,在多线程环境中,依赖于内存差异绝对不是解决方案。

答案 2 :(得分:1)

C有一个sizeOf内在函数(函数?好东西)的唯一原因是因为他们需要它来进行手动内存管理和一些指针算术。

没有必要在Java中使用它。对象占用的内存量是完全实现定义的,并且无法可靠地回答,但您可以通过分配大量相同的对象和平均值来尝试一些统计信息 - 如果您遵守一些基本原则,这可以很好地工作,但这很无聊

如果我们了解一些关于我们VM的基础知识,我们也可以只计算内存,所以对于Hotspot:

  • 每个对象2个字开销
  • 每个对象都是8字节对齐的(即你必须向上舍入到8的下一个倍数)
  • 变量至少有1个单词,即使你有一个没有任何变量的对象我们“浪费”1个单词

此外,你应该了解一下你的语言规范,这样你才能理解为什么内部类有一个额外的引用而不是显而易见的,以及为什么静态内部类没有。

一些工作,但是通常知道这一点通常是无用的 - 如果你担心内存,你不应该既不使用ActionScript也不使用Java而不是C / C ++ - 你可能会在Java中获得相同的性能,但这样做通常会占用大约2倍的内存......