适用于JVM的堆和旧代的大小调整以用于数据繁重的应用程序

时间:2012-06-07 03:10:44

标签: java garbage-collection jvm jvm-hotspot

  • 我正在使用JVM sunjava-1.6.0_21运行服务器应用程序。
  • 我的应用程序数据量很大,充当缓存服务器。因此它存储了许多我们不期望在整个应用程序中运行GC的长期生存数据。
  • 我正在设置以下JVM参数-Xmx16384M-Xms16384M
  • 加载所需数据后,以下是应用程序的内存使用情况
  • 总堆空间为:13969522688
  • 最大堆空间为:15271002112
  • 免费堆空间为:3031718040
  • 长期(旧版)堆存储:Used=10426MB Max=10922MB Used/Max=95%

旧的用法 - 我已经确认这是由于实际数据而且预计不会免费。 我的问题是,默认情况下JVM调整堆空间大小(它分配了10922MB旧版本),这在旧版本部分留下了很少的可用空间。

  • 旧版本的可用空间会减少对应用程序的影响吗?
  • 如果是,我该怎么处理?我应该尝试JVM调整参数,如newratio,并尝试增加旧版本的可用空间或任何其他方式我应该调整应用程序。

2 个答案:

答案 0 :(得分:3)

  

旧版本的可用空间是否会影响应用程序?

如果你的Tenured Gen已经满员,那么将会发生一个重要的收藏,这种类型的收藏成本很高。 您可以使用以下选项:-verbose:gc-XX:+PrintGCDetails来了解Full GC是否经常发生。如果是这样的话,它可能会影响您的应用程序的性能。

  

如果是,我应该如何处理?我应该尝试像newratio这样的JVM调整参数,并尝试增加旧版本的可用空间或任何其他方式我应该调整应用程序。

你可以尝试一下NewRatio,但要记住,如果你的伊甸园太短,你的天赋可能会更快填满。

总而言之,您应该使用监视工具来更好地了解必须使用的VM选项。它将很容易地向您展示在应用程序执行期间如何填充您的世代,它比gc日志更容易阅读和理解;)

答案 1 :(得分:2)

如果您知道对象的生命长度是长时间使用参数设置区域相对于彼此的大小。

您可以在young generationold generation(伊甸园和空间)以及幸存者中设置比率。

目标是通过允许次要垃圾收集释放所有内存来最小化完整垃圾收集。

通过在应用程序中保持对象可访问,可以防止垃圾收集释放对象。我的意思是你应该只关心那些被小垃圾收集删除的对象。

启用参数

-verbose:gc -Xloggc:/opt/tomcat/logs/gc.out -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

然后使用工具GCViewer,您可以看到在gc中花费的时间以及删除的对象的数量(大小)。在一些有用的指标中。