为什么默认 java 最大堆是物理内存的 1/4?

Why default java max heap is 1/4th of Physical memory?

我阅读了几篇关于 java 堆 space 的文章,发现 JVM 的默认最大堆是实际物理 space 的 1/4。但是文章的 none 有这样的理由吗? 为什么要占实际内存的1/4?

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html

这可以追溯到 JDK 5,它介绍了 JVM 人体工程学。在此之前,JVM 会为堆设置非常小的默认值 space。 JDK 1.1 Xms 和 Xmx 的默认值为 16Mb,JDK 1.2 将其默认更改为 1Mb 的 Xms 和 64Mb 的 Xmx。在 JDK 1.3 中,Xms 默认增加到 2Mb。

由于事实证明 Java 在服务器上更受欢迎并且内存容量显着增加,Sun 在 server-class 机器中引入了 [= =49=] 5. 这是一个有 2 个或更多物理处理器和 2 Gb 或更多内存的机器(如果我没记错的话,在 JDK 5 中,机器还必须 not是运行Windows算作服务器)。

在server-class机器上默认设置了以下参数

  • 吞吐量垃圾收集器(即并行收集器)
  • 初始堆大小为物理内存的 1/64,最多 1GB
  • 最大堆大小为物理内存的 1/4,最多 1GB
  • 服务器运行时编译器

Ergonomics 提供了两个命令行标志,允许用户为 JVM 设置性能目标;这个想法是 JVM 然后会在内部弄清楚如何通过修改其参数来实现这个目标。最终目标是消除许多用于手动调整 JVM 性能的 -XX 标志。

参数为:

-XX:MaxGCPauseMillis=nnn 以毫秒为单位设置您希望的 GC 最大暂停时间。

-XX:GCTimeRatio= 将垃圾收集时间与应用程序时间的比率设置为 1 / (1 + nnn)。这被称为吞吐量目标。

您可以指定其中一个目标或同时指定两者。如果 JVM 设法实现这两个目标,它就会尝试减少正在使用的内存(足迹目标)。

此处有更多详细信息:

https://www.oracle.com/technetwork/java/ergo5-140223.html