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,例如尝试增加老一代的可用空间,或者我应该调整应用程序的任何其他方式。
4

2 回答 2

3

老一代的可用空间减少会影响应用程序吗?

如果您的 Tenured Gen 已满,则会发生重大收集,而这种类型的收集成本很高。您可以使用选项 :-verbose:gc-XX:+PrintGCDetails了解 Full GC 是否发生得太频繁。如果是这种情况,那么是的,它会影响您的应用程序的性能。

如果是,我应该如何处理?我是否应该尝试使用诸如 newratio 之类的 JVM 调整参数并尝试增加可用于老一代的空间,或者我应该调整应用程序的任何其他方式。

您可以尝试一下 NewRatio,但请记住,如果您的伊甸园太短,您的终身一代可能会更快地被填满。

To conclude, you should use a monitoring tool to have a better idea of the VM options you have to use. It will show you easily how your generations are filled during the app execution, it's easier to read and understand than gc logs ;)

于 2012-06-08T08:42:05.580 回答
2

如果您知道对象的寿命很长,那么请使用设置区域彼此相关大小的参数。

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

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

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

启用参数

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

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

于 2012-06-08T07:44:20.800 回答