-XX:NewRatio 是 Java Virtual Machine (JVM) 的一個選項,用于調整 年輕代(Young Generation)和 老年代(Old Generation)之間的內存比例。
1. 含義
XX:NewRatio=N 用于指定 老年代 與 年輕代 的內存比例。
N 的含義:
老年代內存占整個堆內存的比例為 (N / (N + 1))。
年輕代內存占整個堆內存的比例為 (1 / (N + 1))。
例如:
-XX:NewRatio=3:
老年代占堆內存的 3/4。
年輕代占堆內存的 1/4。
2. 默認值
HotSpot JVM 中,NewRatio 的默認值為 2:
老年代占堆內存的 2/3。
年輕代占堆內存的 1/3。
3. 使用場景
根據應用程序的內存分配需求,可以調整 NewRatio:
對象生命周期較長的應用(如服務器應用):
推薦使用較高的 NewRatio(如 3 或更高),將更多的堆內存分配給老年代。
對象生命周期較短的應用(如計算密集型應用):
推薦使用較低的 NewRatio(如 2 或更低),將更多的堆內存分配給年輕代。
4. 示例
啟動參數設置
java -XX:NewRatio=3 -Xms512m -Xmx512m -jar myapp.jar
堆內存分布計算
假設堆大小為 512 MB 且 -XX:NewRatio=3:
年輕代:512 MB / (3 + 1) = 128 MB
老年代:512 MB - 128 MB = 384 MB
5. 注意事項
與其他 GC 選項的關系:
如果使用 G1 GC(-XX:+UseG1GC),NewRatio 可能不起作用,因為 G1 GC 會根據應用動態調整堆內存劃分。
對象分配失敗的影響:
如果年輕代內存分配太小,可能導致頻繁的 Minor GC。
如果老年代內存分配太小,可能導致頻繁的 Major GC 或 Full GC。
建議:
監控應用內存使用情況(通過工具如 jstat、VisualVM 或 Java Mission Control),根據實際需要調整。
6. 常見調優組合
初始堆大小和最大堆大小:
-Xms512m -Xmx1024m
年輕代內存固定大小(替代 NewRatio):
-XX:NewSize=128m -XX:MaxNewSize=128m
GC 日志分析:
-Xlog:gc*:gc.log
通過合理調整 NewRatio 和其他 JVM 參數,可以有效優化 Java 應用的內存使用和 GC 行為!