Java进程(非堆)内存泄漏

时间:2014-05-14 15:36:35

标签: java performance memory-leaks native jvm-arguments

问题说明: 我们在Web应用程序中面临以下问题(在CQ5上):

系统配置详情: •系统内存:7GB •Xmx:3.5 GB •Xms:1 GB •MaxPermGen:300MB •观察到的最大线程数:620(包括300个http请求服务线程) •Xss:默认

问题是cq5 java进程(运行servlet引擎)所消耗的内存会随着时间的推移而不断增加。 一旦达到6到6.5 GB以上(系统内存达到7 GB),JVM就会停止响应。 (由于内存不足和繁重的分页活动)。 然而,堆和permgen总体上保持在3.8(3.5 + 0.3)GB或以下。 这意味着非堆内存(本机内存+线程堆栈空间)从几百MB(CQ5服务器重启后)持续增长到超过2-3 GB(长时间运行4-5小时后负载很重)。 所以我们的目标基本上是找出非堆内存中的内存泄漏,这可能是由于第三方库,Java代码的间接引用等引入的。我们没有收到任何内存不足的错误。

需要帮助:

  • 现在我们使用的大部分工具都为我们提供了良好的信息 有关堆内存的详细信息但是我们无法获得原生视图 记忆。请求提供有关如何的宝贵建议 监视非堆内存详细信息(在对象级别或内存区域) 水平)。
  • 如果你们中的任何人遇到过类似的问题(非堆 内存泄漏)在您的任何应用程序中,并希望共享 有关如何修复非堆内存泄漏的知识,请求您 分享您的经验。

1 个答案:

答案 0 :(得分:0)

这实际上取决于您的具体实施:您已部署的代码,您正在使用的基础架构,您正在运行的版本,您使用的应用程序服务器(如果有)重新使用,等等。

那就是说,我遇到了CQ5.5和Image Servlet的内存泄漏问题。它实际上是一个内存泄漏,其中一个Java库为Image Servlet提供支持。它由Java版本更新补救,但它是由Image servlet引起的。这是一个很长的镜头,这是你的问题,但可能值得一提。