【问题标题】:How do I calculate 64bit Java Memory Cost如何计算 64 位 Java 内存成本
【发布时间】:2014-09-10 00:44:22
【问题描述】:

我正在尝试为 Java 64 位对象的字节成本找到一个简单而准确的参考。我一直没能找到这个。原语已明确指定,但我试图找出所有这些边缘情况和异常,例如对象的填充和成本 vrs。它们实际上占用了堆上的空间等。从我在这里阅读的内容来看:http://btoddb-java-sizing.blogspot.com/ 实际上可能不同? :-/

【问题讨论】:

  • 如果您不在白板上进行面试,上面的示例很好。另一方面,如果你是......我的主要问题是我们应该知道足够多的这一点,以便在计算算法的内存效率时有用。根据该问题的答案,也不是非常准确。例如,我知道字符串表,但在数据的情况下,我们可以假设大多数(如果不是全部)字符串是不一样的。
  • 当您担心算法的内存效率时,您通常会担心数组大小。数组需要一个固定的开销加上实际数据的大小——字节、字符、整数、双精度,无论乘以元素的数量。
  • 一个完全没有意义的面试问题,没有一个正确的答案。他们可能一直在期待有关测量方法的答案。否则他们只是错了,炫耀等等。

标签: java memory garbage-collection jvm heap-memory


【解决方案1】:

如果您关闭 TLAB,您将获得准确的记帐,并且您可以准确地看到每个对象分配使用了多少内存。

查看内存使用情况的最佳方法是通过内存分析器。在这里担心字节,很可能会浪费时间。当您拥有数百 MB 时,它会有所作为,而最好的查看方式是在分析器中。

顺便说一句,大多数系统都使用 32 位引用,即使在 64 位 JVM 中也是如此。没有 64 位对象之类的东西。除了标头之外,无论是 32 位 JVM 还是在 64 位 JVM 中使用 32 位引用,对象都将使用相同的空间。

【讨论】:

    【解决方案2】:

    您实际上是在寻求一种简单的方法来准确预测 Java 中的对象大小。

    不幸的是...... 没有!

    您发现的博客文章提到了许多复杂的因素。另一个问题是对象大小计算可能会从一个 Java 版本到下一个版本,或者在不同的 Java 实现供应商之间发生变化。

    在实践中,您的选择是:

    • 根据您所知道的估计尺寸,并接受您的估计可能是错误的。 (如果您考虑到足够多的因素,您应该能够获得合理的大致估计,至少对于特定平台而言。但准确的预测本质上是一项艰巨的工作。)

    • 使用 TLAB 技术编写微基准以测量对象的大小。


    另一点是,在大多数情况下,您的对象大小预测是否不完全准确并不重要。推荐的方法是实施、测量然后优化。在您进入优化阶段之前,这不需要准确的尺寸信息,此时您可以测量尺寸......如果您需要信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 2011-01-06
      • 2021-05-09
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多