【问题标题】:Java: Find out memory size of object? [duplicate]Java:找出对象的内存大小? [复制]
【发布时间】:2011-11-12 13:41:50
【问题描述】:

可能重复:
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 中做到这一点?

【问题讨论】:

  • 谢谢,在我问之前我确实看到了 - 但我认为 Java 可能有它自己的方法。我不想为快速查询创建一个全新的类

标签: java memory actionscript size byte


【解决方案1】:

如果您关闭-XX:-UseTLAB,您可以在前后检查 Runtime.freeMemory()。但是,对于局部变量,它们不会占用堆空间(因为它们使用堆栈),并且您无法获取它的大小。

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

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

【讨论】:

  • 这里有点超出我的深度。你能举个例子吗?我真的不知道如何关闭 -XX:-UseTLAB?
  • 它是一个命令行选项,你将它添加到命令行中的类名之前。基本上,对象的大小不是您需要知道的。这对您来说可能很有趣,但我建议您不要担心,除非您知道自己有问题。在哪个原因我会使用分析器,这会给你实际的尺寸。
  • @PeterLawrey - 请参阅链接的问题以获得更好的方法。
  • 如果您想将其用于实验之外,使用 Instrumentation 会更好。有对象的深度大小调整的例子。恕我直言,但是最好的方法是使用分析器,只担心消耗最多内存的事情。
【解决方案2】:

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

在 Java 中没有必要这样做。此外,一个对象占用多少内存是完全由实现定义的,无法可靠地回答,但您可以通过分配大量相同的对象并进行平均来尝试一些统计数据 - 如果您遵守一些基本原则,这可以很好地工作,但这很无聊.

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

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

您还应该了解您的语言规范,以便了解为什么内部类有 1 个额外的引用而不是显而易见的,以及为什么静态内部类没有。

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

【讨论】:

    【解决方案3】:

    我相信没有直接的方法可以做到这一点。 @Peter Lawrey 的建议可能是一个近似值。但是,您不能依赖于通过计算对象构建前后可用可用内存之间的差异来计算对象大小,因为其他线程也可能在后台发生许多其他分配。此外,垃圾收集器可能会启动并在您的操作之间释放一些内存。另外特别是,在多线程环境中依赖内存差异绝对不是解决办法。

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 1970-01-01
      • 2012-03-08
      • 2011-01-04
      • 2010-10-10
      • 2011-05-06
      • 2014-08-06
      • 2016-09-17
      • 2014-02-05
      相关资源
      最近更新 更多