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

问题描述 投票:0回答:1

我已经阅读了几篇关于Java堆空间的文章,发现JVM的默认最大堆是实际物理空间的1/4。但是,没有一篇文章有​​这个理由吗?将其作为实际内存的1/4的原因是什么?

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

java garbage-collection
1个回答
0
投票

这可以追溯到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才能算作服务器)。

默认情况下,在服务器级计算机上,设置了以下参数

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

人机工程学提供了两个命令行标志,这些标志允许用户设置JVM的性能目标;这样的想法是,JVM将在内部找出如何通过修改其参数来实现此目标的方法。最终目标是消除大量用于手动调整JVM性能的-XX标志。

参数为:

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

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

您既可以指定这些目标,也可以同时指定两个。如果JVM设法实现了这两个目标,那么它将尝试减少正在使用的内存(占用空间目标)。

这里有更多详细信息:

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

© www.soinside.com 2019 - 2024. All rights reserved.