java - HotSpot JVM 会动态改变新生代的大小吗?

标签 java garbage-collection jvm jvm-hotspot

关于 HotSpot JVM 垃圾收集的一些问题。

我们有一个正在运行的 java 进程,选项是:

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps 
-Xloggc:/mnt/dfs/0/hdfs/logs/namenode.gc.log -XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled -XX:-DisableExplicitGC -XX:+UseCMSCompactAtFullCollection 
-XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -server -Xmx92160m -Xms92160m 
-Xss256k -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution

如您所见,最大堆大小约为 90G。

根据 this article , NewRatio=2 和 SurvivorRatio=8 默认。所以伊甸园 大小应为90G*1/3*8/10=24G,幸存者大小应为90G*1/3*1/10=3G。

但实际上,当我使用jstat时:

sudo jstat -gcnew 37082
S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
48960.0 48960.0    0.0 5981.3 15  15 24480.0 391936.0  82332.7  13351 1379.450

Eden 大小只有 390MB 左右,Survivor 大小只有 48MB。这导致了很多年轻的gc。

谁能告诉我为什么 Eden size 这么小?

最佳答案

Eden 的大小只是它需要的大小。如果您生成更多短期垃圾,NewSize 会更大。

关于java - HotSpot JVM 会动态改变新生代的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26608136/

相关文章:

java - Android下获取DNS TCP TLS时间

java - 动态生成的 JButton 的 actionEvent 不起作用

java - 如何在 Eclipse 插件上动态或更新名称?

c - 关于共享指针

java - Coldfusion 组件吃 JVM 内存

scala - 如果应用程序运行很长时间,则缺少类

java - 如何用 JPanel 填充 JFrame 窗口?

Java垃圾收集日志输出

java - java虚拟机如何将用户级函数与其内部函数连接起来?

java - 了解 Java 调试的真正工作原理