如何计算GC工作所需的oldGen的大小?

时间:2013-03-12 15:36:28

标签: java garbage-collection heap-memory

我有java web(tomcat)应用程序,它消耗10G的堆内存(代表内存中的数据结构)。 但是当我设置例如Xmx到20G。

当我设置堆内存时,例如到11G我的应用程序无法加载所有数据 - 它进入连续的完整gc。假设垃圾收集器还需要内存来使gc变得高效。 这是对的吗?我应该为gc的高效工作添加多少内存? 感谢。

2 个答案:

答案 0 :(得分:2)

如果您需要加载大量数据,则设置永久性生成分配会更好。实际上,这个永久生成用于保存VM本身的反射数据,例如类对象和方法对象。这些反射物体直接分配到永久世代中,并且其大小独立于其他世代。

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

答案 1 :(得分:2)

找出最佳OldGen尺寸

  1. 启用 GC记录 -XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion

  2. 计算实时数据 = FullGC后旧OldGen的占用情况(有关详细信息,请参阅Advanced JVM Tuning)。顺便说一句。试着平均。通过观察几个FullGC周期后的OldGen占用情况。

  3. 最佳 OldGenSize == 2x 3x 实时数据