我读了几篇关于Java堆空间的文章,发现JVM的默认最大堆大小是实际物理空间的1/4。但是这些文章都没有解释为什么会这样?为什么要将其设置为实际内存的四分之一呢?参考链接:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html
这可以追溯到JDK 5,它引入了JVM人体工程学。在此之前,JVM会为堆空间设置非常小的默认值。JDK 1.1的默认值为16Mb,JDK 1.2将其更改为默认情况下Xms为1Mb,Xmx为64Mb。在JDK 1.3中,Xms默认值增加到2Mb。由于Java在服务器上越来越受欢迎,内存容量显着增加,Sun在JDK 5中引入了“服务器级”机器的概念。这是具有2个或多个物理处理器和2个或多个Gb内存的机器(如果我没记错,在JDK 5中,机器还不能运行Windows才算是服务器)。在服务器级机器上,默认情况下设置以下参数: 吞吐量垃圾收集器(即并行收集器) 初始堆大小为物理内存的1/64,最高1Gbyte 最大堆大小为物理内存的1/4,最高1Gbyte 服务器运行时编译器 Ergonomics提供了两个命令行标志,允许用户为JVM设置性能目标;其想法是JVM通过修改其参数来内部计算如何实现此目标。最终目标是消除大量用于手动调整JVM性能的-XX标志。这些参数包括:-XX:MaxGCPauseMillis=nnn,它设置您希望GC在毫秒级别下的最大暂停时间。-XX:GCTimeRatio=,它将垃圾收集时间与应用程序时间的比率设置为1 /(1 + nnn)。这被称为吞吐量目标。您可以指定这些目标中的任意一个或两个。如果JVM成功实现这两个目标,则尝试减少正在使用的内存(占用空间目标)。更多详细信息请参见此处: https://www.oracle.com/technetwork/java/ergo5-140223.html