我已经阅读了几篇关于Java堆空间的文章,发现JVM的默认最大堆是实际物理空间的1/4。但是,没有一篇文章有这个理由吗?将其作为实际内存的1/4的原因是什么?
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html
这可以追溯到JDK 5,它引入了JVM人机工程学。在此之前,JVM将为堆空间设置非常小的默认值。 JDK 1.1的Xms和Xmx的默认值均为16Mb,JDK 1.2默认将其更改为1Mb的Xms和64Mb的Xmx。在JDK 1.3中,Xms默认增加到2Mb。
由于Java证明在服务器上更受欢迎,并且内存容量显着增加,因此Sun在JDK 5中引入了server-class机器的概念。这是具有2个或更多物理处理器和2个或更多Gb的机器。内存(如果我没记错的话,在JDK 5中,该计算机还必须not运行Windows才能算作服务器)。
默认情况下,在服务器级计算机上,设置了以下参数
人机工程学提供了两个命令行标志,这些标志允许用户设置JVM的性能目标;这样的想法是,JVM将在内部找出如何通过修改其参数来实现此目标的方法。最终目标是消除大量用于手动调整JVM性能的-XX标志。
参数为:
-XX:MaxGCPauseMillis = nnn设置您希望GC的最大暂停时间,以毫秒为单位。
-XX:GCTimeRatio =将垃圾回收时间与应用程序时间之比设置为1 /(1 + nnn)。这被称为吞吐量目标。
您既可以指定这些目标,也可以同时指定两个。如果JVM设法实现了这两个目标,那么它将尝试减少正在使用的内存(占用空间目标)。
这里有更多详细信息: