【问题标题】:Does JVM memory overhead scale linearly, or is it constant? [closed]JVM 内存开销是线性扩展的,还是恒定的? [关闭]
【发布时间】:2014-01-29 04:55:01
【问题描述】:

根据我的经验,使用大约 10 MB 常驻内存的 C 程序在翻译成 Java 时可能使用大约 40 到 50 MB,而在 Clojure 或 Scala 中大约需要 100 MB。我的问题是这个 JVM 内存开销是否线性扩展?如果 C 版本使用 1 GB,Java 版本是否需要 4 GB?还是 JVM 内存开销更多是一个常数因素,以至于 1 GB 的 C 程序在 Java 中可能只使用 1.5 GB?

我知道我可以对此进行基准测试,但我认为听取人们关于生产中 JVM 内存使用的经验会比人工基准测试提供更多信息,根据设计方式,人工基准测试可能偏向于偏向任一结果。

【问题讨论】:

  • 我认为优秀的垃圾收集 java 应该显示出类似算法更少的内存利用率。但这在很大程度上取决于您正在运行的确切程序
  • 强烈反对意见
  • @LogicChains 虽然它不是一个论坛(就像SO it's Q&A site)Quora 可能更适合。
  • 我的机器上有 24Gb 的空间,还有很多可用空间,但我需要为我的网站上成千上万的访问者提供服务 - 所以分配速度对我来说很重要。为什么要关心确切的堆大小?
  • 认真的模组? 不可能这是基于意见的。它是 100% 可测量的。仅仅因为它很复杂并不能使它基于意见。一个好的答案可以很容易地突出关键变量(实现差异、类开销、不同的数据类型等)。投票重新开放。

标签: java scala clojure jvm


【解决方案1】:

开销约为 10MB + 4xC 内存。

10MB 是没有任何东西的 JVM。 Java 7 64bit 版本用的就这么多。

4x 内存显然是“猜测”,因为它取决于您使用的数据类型。如果你在 java 中使用 100% 的引用,它们会占用大约 4 倍的内存。 int 和 Integer 之间也有同样的区别。

如果你的 C 代码中有很多 malloc/new,那么 Java 中也会有,而且 Java 的 GC 可能不会在你想要的时候运行,所以还有“死引用尚未清理”的开销这在很大程度上取决于您无法控制的事情(GC 时间)。

【讨论】:

  • 我想这证明了 om-nom-nom 的观点。
  • JVM 上的 malloc 只是碰撞堆指针,“大量 malloc”是 Java 性能轻松超过 C++ 的主要场景之一。您还会发现 GC 具有高度可调性。
  • 4x 可能是真的如果你用 Java ints 替换 C Integers,但这不是一个同类比较(也不是你通常翻译的方式代码)。 C 32 位 int 和原始 Java int 使用相同数量的空间。
猜你喜欢
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多