Java 进程(非堆)内存泄漏
Posted
技术标签:
【中文标题】Java 进程(非堆)内存泄漏【英文标题】:Java process (Non-Heap) Memory Leak 【发布时间】:2014-05-14 15:36:35 【问题描述】:问题描述: 我们在 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。 这意味着非堆内存(本机内存 + 线程堆栈空间)从几个 100 MB(在 CQ5 服务器重新启动后)一直增长到超过 2-3 GB(在重负载下长时间运行 4-5 小时后)。 所以我们的目标基本上是找出非堆内存中的内存泄漏,这可能是由于 3rd 方库、Java 代码的间接引用等引起的。我们没有收到任何内存不足的错误。
需要帮助:
现在我们使用的大多数工具都为我们提供了良好的信息和 有关堆内存的详细信息。但是我们无法看到原生的 记忆。请求提供您关于如何使用的宝贵建议 监视非堆内存详细信息(在对象级别或内存区域 等级)。 如果你们中的任何人都遇到过类似的问题(非堆 内存泄漏)在您的任何应用程序中,并希望分享 有关如何修复非堆内存泄漏的知识,请您 分享您的经验。【问题讨论】:
我猜valgrind 是你的朋友。 考虑分析您的应用程序或使用 JFR:***.com/questions/1207802/… 检查缓存配置 - 失控的内存使用可能是由于缺少条目失效调用或过多的 TTL。 见***.com/questions/26041117/… 【参考方案1】:这实际上取决于您的具体实施:您已部署什么代码、您使用什么基础设施、您正在运行什么版本、您正在使用什么应用服务器(如果有的话)等等。
也就是说,我遇到了 CQ5.5 和 Image Servlet 的内存泄漏问题。它实际上是在为 Image Servlet 提供支持的 Java 库中的一个内存泄漏,在幕后。它已通过 Java 版本更新得到补救,但它是由 Image servlet 引起的。这是您的问题,但可能值得一提。
【讨论】:
谢谢 ryanlunka。我们已经检查了 JPEGImage Servlet,这不是问题所在。实际上在堆中没有问题。只是java进程的常驻内存不断增加。 您对如何分析或分析进程内存(除了堆、代码缓存和 permgen)有任何想法吗?我查看了 unix 中的 /proc/pid/smaps 和 /proc/pid/maps 但它们没有提供足够的细节。以上是关于Java 进程(非堆)内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章