2013-03-12 73 views
1

我有java web(tomcat)應用程序,它使用10G堆內存(表示內存中的數據結構)。 但是,當我將例如Xmx到20G。如何計算GC工作所需的oldGen的大小?

當我設置堆內存例如到11G我的應用程序無法加載所有數據 - 它以連續完整的gc格式輸入。假設垃圾收集器也需要內存來提高gc的效率。 它正確嗎?我應該爲gc的高效工作添加多少內存? 謝謝。

回答

2

要找出最優OldGen大小

  1. 一個FullGC後啓用GC日誌-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion

  2. 計算實時數據大小 =老OldGen佔用(更多細節見Advanced JVM Tuning)。順便說一句。嘗試獲得平均值。通過觀察幾個FullGC週期後的OldGen佔用情況。

  3. 最佳OldGenSize == 2X實時數據大小的3倍

2

如果您在加載大量數據時設置了永久生成分配,它會更好。實際上,這個永久生成器用於保存虛擬機本身的反射數據,例如類對象和方法對象。這些反射物體被直接分配到永久世代中,並且其大小與其他世代獨立。

-Xms10G -Xmx20G -XX:PermSize=5G -XX:MaxPermSize=12G 
+0

似乎MaxPermSize不是用於堆內存? – user710818 2013-03-12 15:43:05

+0

堆內部有兩部分。找到一個解釋[這裏](http://stackoverflow.com/questions/4848669/perm-space-vs-heap-space) – 2013-03-12 15:45:51

+0

理解。謝謝。所以可能是gc使用permgen來完成它的工作? – user710818 2013-03-12 15:47:09