为什么默认 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 设法实现这两个目标,它就会尝试减少正在使用的内存(足迹目标)。
此处有更多详细信息:
我阅读了几篇关于 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 设法实现这两个目标,它就会尝试减少正在使用的内存(足迹目标)。
此处有更多详细信息: