1

我有消耗 10G 堆内存(表示内存中的数据结构)的 java web (tomcat) 应用程序。但是当我将例如 Xmx 设置为 20G 时它会起作用。

当我将堆内存设置为 11G 时,我的应用程序无法加载所有数据 - 它进入连续的完整 gc。假设垃圾收集器也需要内存来使 full gc 高效。它正确吗?我应该为 gc 的有效工作添加多少内存?谢谢。

4

2 回答 2

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. 计算Live Data Size = FullGC 后旧 OldGen 的占用率(有关详细信息,请参阅高级 JVM 调优)。顺便提一句。尝试获得平均值。通过在几个 FullGC 周期后观察 OldGen 的占用情况。

  3. 最佳OldGenSize == Live Data Size23 倍

于 2013-03-12T19:06:59.107 回答
2

如果您设置永久代分配会更好,因为您有大量数据要加载。实际上,这个永久代用于保存 VM 本身的反射数据,例如类对象和方法对象。这些反射对象被直接分配到永久代,并且它的大小独立于其他代。

-Xms10G -Xmx20G -XX:PermSize=5G -XX:MaxPermSize=12G
于 2013-03-12T15:40:32.227 回答