【问题标题】:How to calculate size for oldGen needed for work of GC?如何计算 GC 工作所需的 oldGen 大小?
【发布时间】:2013-02-28 05:13:32
【问题描述】:
我有一个消耗 10G 堆内存(表示内存中的数据结构)的 java web (tomcat) 应用程序。
但是当我设置时它会起作用,例如Xmx 到 20G。
当我设置堆内存时,例如到 11G 我的应用程序无法加载所有数据 - 它进入连续完整的 gc。假设垃圾收集器也需要内存来使 full gc 高效。
它正确吗?我应该为 gc 的有效工作添加多少内存?
谢谢。
【问题讨论】:
标签:
java
garbage-collection
heap-memory
【解决方案1】:
要找出最佳 OldGen 大小:
启用 GC 日志记录 -XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
计算 实时数据大小 = 在 FullGC 后旧 OldGen 的占用率(有关详细信息,请参阅 Advanced JVM Tuning)。顺便提一句。尝试获得平均值。通过在几个 FullGC 循环后观察 OldGen 的占用情况。
最佳 OldGenSize == 2x 到 3x 实时数据大小。
【解决方案2】:
如果您设置永久代分配会更好,因为您需要加载大量数据。实际上,这个永久代用于保存 VM 本身的反射数据,例如类对象和方法对象。这些反射对象被直接分配到永久代,并且它的大小独立于其他代。
-Xms10G -Xmx20G -XX:PermSize=5G -XX:MaxPermSize=12G
【讨论】:
-
-
-
不确定 GC 的使用,但您查看堆空间方向。 Here