100%老一代 - 这是一个问题吗?

时间:2014-12-11 04:26:32

标签: java garbage-collection jvm heap

我们正在对应用程序进行负载测试,经过一段时间后,AppDynamics以100%的红色报告“PS Old gen”。 Full GC每10分钟运行一次。内存的“当前利用率”在 70-90%之间变化,它会持续数小时,并且永远不会因OOM而失败。

我认为一旦旧的生成利用率高于一定水平,GC将尝试释放/压缩旧的gen区域,如果没有任何东西被释放,它将无法通过OOM失败并在它之前开始疯狂的完整GC循环。但是,我没有看到任何这些。该应用程序运行良好,100%的旧数据利用率。

我们正在使用Oracle Java 7u14(64b,4个cpu内核,10GB RAM)和JVM配置

-XX:+UseParallelOldGC -Xmx4g

谢谢!

1 个答案:

答案 0 :(得分:1)

这是否是一个问题,由你决定。

  • 一方面,每10分钟运行一秒钟的完整GC不是吞吐量的重要问题。

  • 另一方面,完整的GC可能会大大缩短那一秒窗口的响应时间。但这可能并不重要甚至与您的申请相关。

我担心的是你的负载测试是否是一个真实的测试。该应用程序似乎需要4Gb的堆空间进行测试,但它是否也需要在现实世界中使用?我担心在将其部署到生产环境中时可能会出现内存泄漏。或者负载测试中的负载导致应用程序的内存缓存达到稳定状态,因为生产中不会再生产。

作为一般规则,堆运行接近完全是一件坏事,因此可能建议增加堆。您的应用程序的性能似乎并没有受到影响,但您可能会在风口浪尖上#34;


  

我认为一旦旧的生成利用率高于一定水平,GC将尝试释放/压缩旧的gen区域,如果没有任何东西被释放,它将无法通过OOM失败并在它之前开始疯狂的完整GC循环。

我怀疑监控报告可能会误导您。如果完整的GC周期真的没有回收任何东西,我预计行为会有所不同。

尝试打开JVM GC日志消息,看看他们告诉您完整GC周期管理回收的内存量。