针对数据密集型应用程序,合适的JVM堆和老年代大小设置

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

旧代使用情况 - 我已确认这是由于实际数据而不是预期获得释放。我的问题是默认情况下JVM对堆空间的大小(它分配了10922MB旧代),这在旧代部分留下了很少的空闲空间。

  • 旧代中较少的空闲空间会影响应用程序吗?
  • 如果是,我该如何处理?是否应尝试使用JVM调整参数(如newratio)并尝试增加旧代可用空间或者有其他方法可以调整应用程序?

这是一个虚拟服务器还是物理服务器? - Anders
那么这个链接会对您有所帮助 - http://www.vmware.com/files/pdf/techpaper/Enterprise-Java-Applications-on-VMware-Best-Practices-Guide.pdf - Anders
2个回答

3
如果老年代的可用空间不足,会影响应用程序吗?
如果Tenured Gen已满,将发生一次大规模的垃圾回收,这种类型的垃圾回收成本很高。您可以使用选项: -verbose:gc -XX:+ PrintGCDetails 来了解 Full GC 是否经常发生。如果是这种情况,那么是的,它可能会影响应用程序的性能。
如果是这样,我该如何处理?我应该尝试使用JVM调整参数(例如newratio)来增加老年代的可用空间,还是有其他方法可以调整应用程序?
您可以尝试NewRatio,但请记住,如果eden过短,则tenured gen可能会更快地填满。
最后,您应该使用监视工具来更好地了解您必须使用的VM选项。它将在应用程序执行期间轻松显示您的生成如何填充,比gc日志更易于阅读和理解;)

请问您能否指出一些使用分析器进行此类监控的资源? - MoveFast
@ManojGumber 经常使用的一个工具是VisualVM:http://visualvm.java.net/ 在页面底部,您可以找到一个名为“使用VisualVM显示Java内存池统计信息”的链接。这可能会对你很有帮助。浏览一下不同的插件和文档,你会发现一些很棒的东西! - alain.janinm

2
如果您知道对象的寿命很长,请根据彼此之间区域大小设置参数进行调整。
您可以在年轻代老年代(伊甸园和终身空间)以及两个幸存者中设置比率。
目标是通过允许次要垃圾回收释放所有内存来最小化完整垃圾回收。
通过使应用程序中可达到这些对象,防止垃圾回收释放对象。我的意思是,您只需要关心那些被次要垃圾回收删除的对象。
启用参数。
-verbose:gc -Xloggc:/opt/tomcat/logs/gc.out -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接