【发布时间】:2016-10-02 06:58:28
【问题描述】:
我的 WebLogic 服务器配置了 16gb 的堆空间,但在大多数用户开始工作时,在生产使用的 1 小时内使用了 90%。我观察到,每当发生这种情况时,都会有几个线程被卡住。
当堆大约有 10% 空闲时,我捕获了堆转储。如何检查堆转储以找出导致此问题的内存泄漏或进程代码。
我试图了解内存泄漏,运行 JMap 和 Eclipse MAT 等工具,但可能由于缺乏经验,我无法理解这些工具试图显示什么。或者我应该如何/注意什么?
我要分析 GC 堆转储之前/之后。
我查看了线程转储,没有“等待锁定”对象线程,线程类似如下所示,没有明显原因的线程卡住。
【问题讨论】:
-
您应该进行几次线程转储,以查看 ExecuteThread '0' 的确切操作以及它是否在 JSP (goto.jsp) 上被阻塞。这可能是内存泄漏的根本原因。不要考虑被阻塞的 ExecuteThread '3',因为它是一个套接字复用器线程。
-
您是否检查了 ChangeAwareClassLoader 的每个实例的已加载类列表?
-
我看不到 227MB = 90% 的 16GB 堆?
-
@tair 我做了一个 jmap live heap dump,是这个原因吗?
-
@optimus 如果堆转储能够将 16GB 堆整理到 227MB 的 活动对象,则不太可能存在内存泄漏
标签: java multithreading garbage-collection weblogic12c