当前位置: 首页 > 知识库问答 >
问题:

内存泄漏的java堆和线程分析

耿星雨
2023-03-14

我的WebLogic服务器配置了16GB的堆空间,但当大多数用户开始工作时,90%的堆空间在生产使用1小时内就被使用了。我观察到每当这种情况发生时,都有几条线卡住了。

我已经检查了线程转储,没有“等待锁定”对象线程,线程类似于如下所示,线程没有明显的原因被卡住。

共有1个答案

华烈
2023-03-14

根据您的堆转储,您最大的内存问题是int数组,实际上它占用了将近70%的堆(是的,而是对大小列进行排序)。

  1. 在堆转储中选择它,右键单击并选择在实例视图中显示
  2. 然后浏览最大的对象,对每个对象右键单击并选择Show最近的GC根,以查看哪个对象仍然对int数组有硬引用,从而不符合GC的条件。

它可以帮助您找到您的内存泄漏假设它是一个内存泄漏。

请参见下面的最近的GC根示例,该示例允许识别我故意添加到程序中的漏洞,只是为了展示这个想法。正如您在屏幕截图中看到的,我有一个int数组,它不适合GC,因为它存储在我的类应用程序中名为leakHashmap中,所以我知道内存问题可能是由于这个特定的Hashmap引起的,特别是如果我有许多其他对象导致这个Hashmap

注意:当您试图识别漏洞时要有耐心,因为它并不总是显而易见的,理想的情况是,您有一个巨大的对象占据了整个堆,但显然这不是您的情况没有什么真正明显的原因,这就是我建议首先研究int数组的原因。不要忘记,它也可能是很小的int数组,但有数千个int数组具有相同的最近的GC根

另一个技巧是,如果您有JProfiler,您可以简单地按照这个精彩的教程来查找漏洞。

响应更新:

要更好地确定内存泄漏的根本原因,一个简单的方法是至少进行两个堆转储,然后使用jhat之类的工具比较它们,语法如下

jhat -J-Xmx2G -baseline ${path-to-the-first-heap-dump} ${path-to-the-second-heap-dump}

它将在端口7000上启动一个小型HTTP服务器,因此:

  1. 启动http://localhost:7000/
  2. 然后单击显示所有类(包括平台)的实例计数

然后您将看到按创建的新实例总量排序的类列表。然后,您可以使用VisualVM执行我在回答的第一部分中描述的操作,以查找内存泄漏的根本原因。

您还可以使用JHAT

  1. 通过为每个类选择顶级类
  2. 单击一个“对此对象的引用”
  3. 然后单击排除弱引用

然后您将看到每个实例的GC根,如下图所示:

另一种方法是使用Eclipse内存分析器,也称为MAT

  1. 用它打开第二个快照
  2. 选择视图直方图
  3. 然后对每个顶级类右键单击
  4. 选择合并到GC根的最短路径/排除所有引用

然后您将看到类似于下一个截图的内容:

 类似资料:
  • 问题描述:我们在一个web应用程序(在CQ5上)中面临以下问题: 系统配置详细信息:系统内存: 7GB Xmx: 3.5 GB Xms: 1 GB MaxPermGen: 300MB最大观察线程数: 620(包括300个超文本传输协议请求服务线程)Xss:默认值 问题是cq5 java进程(运行servlet引擎)消耗的内存随着时间的推移而不断增加。一旦达到6到6.5GB以上(系统内存达到7GB)

  • 问题内容: 在多个帖子中都提到了这一点:不当使用会导致内存泄漏。我正在努力了解使用内存泄漏将如何发生。 我发现的唯一情况如下: Web服务器维护一个线程池(例如,用于servlet)。如果未删除其中的变量,则这些线程可能会导致内存泄漏,因为线程不会死亡。 这种情况下没有提到“ Perm Space”内存泄漏。那是内存泄漏的唯一(主要)用例吗? 问题答案: PermGen的exhaustions 与

  • 本文向大家介绍Java 内存泄漏,包括了Java 内存泄漏的使用技巧和注意事项,需要的朋友参考一下 在Java中,垃圾回收(析构函数的工作)是使用垃圾回收自动完成的。但是,如果代码中有引用它们的对象怎么办?它无法取消分配,即无法清除其内存。如果这种情况一再发生,并且创建或引用的对象根本没有被使用,它们就会变得无用。这就是所谓的内存泄漏。 如果超过了内存限制,则程序将通过抛出错误(即“ OutOfM

  • 我的Optaplanner似乎出现了内存泄漏。要复制,只需下载Quarkus示例: 然后通过增加终止时间(例如,将)和取消注释表示的行来更改以启用多线程。 然后,运行手册中的请求: 内存使用量开始稳步增加,同时生成了数百万个PhreakPropagationContext对象。我认为这不是预期的行为。我应该为此制造问题还是遗漏了什么?

  • 问题内容: 我发现使用是众所周知的与相关的内存问题。 使用中是否存在内存泄漏? 如果是,解决方法是什么? 以下链接显示了Java中子字符串的正确用法。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4513622 另外一个博客谈论子字符串中可能的MLK。 http://nflath.com/2009/07/the-dangers-of- st

  • 我担心从泄漏金丝雀回来的信息。它显示了在UI上声明的所有变量,如片段中的材料按钮、材料卡片视图、文本视图、图像视图等,都导致了内存泄漏。我不知道为什么会这样。