2013-03-12 32 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