我正在JDK1.6.0_16
上托管的Java应用程序使用Linux Intel procesor 80 cores machine
JVM。
启动Java应用程序时,我只配置了两个选项
JVM选项中的-Xms2048m -Xmx8000m
(在java命令之后)。
我看到PS Old Gen计算为5.21G
,PS Eden计算为2.6G
,但PS幸存者空间为25MB
。
我在生产中有完全相同的JVM,并且PS Survivor Space的大小显示为888MB
。我在java任务控制内存选项卡中看到这些大小。
缓存大小(/ proc / cpuinfo的输出)在UAT和生产框中都显示24656
。
不要认为它会对JVM产生任何影响,但仍然提到在启动JVM时机器上的负载非常低。
您能否告知JVM在计算PS幸存者空间大小时会考虑哪些参数?
答案 0 :(得分:1)
您能否告知JVM在计算PS Survivor Space大小时会考虑哪些参数?
它必须足够大,以便在收集伊甸园空间后永远不会填满,否则您将获得不受欢迎的Full GCs。
什么是最佳幸存者空间大小取决于您的应用程序。我建议你在实际负载下测试你的应用程序,使用比你想象的更大的Eden和Survivor空间,看看有多少空间被使用,并根据你看到的使用情况增加50%到100%。
机器有256G的物理内存,其中~200G
默认堆大小为32 GB,我建议您使用此默认值,除非您有充分理由减少它。
-XX:SurvivorRatio = 1
这通常是一个坏主意,像8这样的幸存者比率通常更高。
将值设置为8没有任何影响
您很可能分配率较低。我通常设置一个较高的Young空间,类似于-Xmn8g
甚至-Xmn24g
,但这是否好/坏主意取决于您的应用。
答案 1 :(得分:1)
来自oracle gc tuning article 1和article 2:
幸存者空间大小
您可以使用参数
SurvivorRatio
来调整幸存者空间的大小,但这通常对性能不重要。例如, -XX:SurvivorRatio=6
将伊甸园和幸存者空间之间的比率设置为1:6。
In other words, each survivor space will be one-sixth the size of eden, and thus one-eighth the size of the young generation (not one-seventh, because there are two survivor spaces)
。
如果幸存者空间太小,则复制集合会直接溢出到终身代。如果幸存者空间太大,它们将毫无用处。
NewSize
和MaxNewSize
参数控制新一代的最小和最大尺寸。通过将这些参数设置为相等来调节新一代的大小。 The bigger the younger generation, the less often minor collections occur
。
NewRatio:
年轻一代相对于老一代的规模由NewRatio控制。例如,设置-XX:NewRatio=3
表示旧一代与年轻一代之间的比率为1:3
,the combined size of eden and the survivor spaces will be fourth of the heap
。
正如Peter Lawrey
正确引用的那样,设置幸存者取决于您的应用程序的类型。来自Oracle的gc调优文章,以下是指南。
First decide the maximum heap size you can afford to give the virtual machine
。然后根据年轻一代规模绘制绩效指标,以找到最佳设置
If the total heap size is fixed, then increasing the young generation size requires reducing the tenured generation size
。保持终身代足够大,以容纳应用程序在任何给定时间使用的所有实时数据,加上一些松弛空间(10%到20%或更多)。
根据先前对终身代的约束:为年轻一代提供充足的记忆和increase the young generation size as you increase the number of processors, because allocation can be parallelized
。默认值是根据NewRatio
和-Xmx
设置