5

我正在关注这个问题,发现所有信息都已过时。

最新的指南似乎是有关 GC 调整的文档。Oracle 在其中定义了他们愚蠢的术语人体工程学,我认为这只是意味着合理(“舒适”)的默认值。在该文档中,该文档被称为,在上述 SO 问题中被大量引用。

它声称最大堆大小计算如下:

物理内存的 1/4 或 1GB 中的较小者。在 J2SE 5.0 之前,默认的最大堆大小为 64MB。您可以使用 -Xmx 命令行选项覆盖此默认值。

这显然是错误的,因为我有一台我测试过的机器,它有 12 GB 的 RAM 和 4096 MB,如java -XX:+PrintFlagsFinal -version | grep HeapSize. 但需要注意的是:

注意:为堆大小指定的边界和分数对于 J2SE 5.0 是正确的。随着计算机变得更强大,它们在后续版本中可能会有所不同。

太棒了!除了我找不到任何关于此的最新文档。我根据这个问题验证了我正在运行一个服务器类。为什么这很重要?因为我的 12 GB 服务器类机器默认为 170 MB。一切都打破了这一点。是的,我知道我可以覆盖它。我宁愿不必在我运行的每个应用程序中复制该覆盖,也不想将其硬编码到 pom 文件中。更重要的是,这个数字在我的机器上以某种方式随机变化,我需要了解它是如何被撞到的。

这是我的java版本:

$ java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)

我在 Mac OS X 10.9.2 上。

4

1 回答 1

1

你是对的。关于 Java 内存管理的文档既过时也不完整:Xmx 只是一个例子。

我做了同样的观察并改变了我的行为:我总是指定 Xmx。

在我看来,这不是问题。Java 程序所需的内存不应依赖于您的硬件。此外,我认为这是一个很好的做法:在您的脚本/配方中明确指定 Xmx(和其他调整)有助于在所有环境中具有相同的行为(开发/产品经常具有不同的硬件配置)

于 2014-05-22T16:28:14.767 回答