堆转储-保留大小的循环引用

时间:2019-03-20 16:27:31

标签: jvm out-of-memory vaadin heap-memory eclipse-memory-analyzer

prod中一个长时间运行的旧应用程序内存不足。在分析线程转储时,我以保留的大小进行导航,并寻找保留的大小很多的对象,以了解导致内存问题的原因(泄漏或某个进程中的对象过多)。

在这种情况下,内存泄漏报告从码头指向HashedSession。在查看会话时,我可以看到该会话在应用程序内包含对象,这些对象的属性周期内引用同一会话。

现在,问题是我无法确定保留大小的成分是什么(总和等于保留总大小),以及它们来自何处。会话中最大的大小是会话本身,其他属性几乎没有任何内容。

Class Name                                                                          | Retained Heap
----------------------------------------------------------------------------------------------------
org.eclipse.jetty.server.session.HashedSession @ 0x77d47bf70                        |   201 414 144
|- _attributes java.util.HashMap @ 0x782c20250                                      |   201 414 056
|  |- table java.util.HashMap$Node[16] @ 0x78594db98                                |   201 414 008
|  |  |- [10] java.util.HashMap$Node @ 0x787047090                                  |   201 411 880
|  |  |  |- value com.vaadin.terminal.gwt.server.WebApplicationContext @ 0x784244740|   201 411 848
|  |  |  |  |- session org.eclipse.jetty.server.session.HashedSession @ 0x77d47bf70 |   201 414 144
|  |  |  |  |- browser com.vaadin.terminal.gwt.server.WebBrowser @ 0x7832eeb68      |           400
|  |  |  |  |- applications java.util.HashSet @ 0x787a9e1a8                         |           192
|  |  |  |  |- applicationToAjaxAppMgrMap java.util.HashMap @ 0x783280118           |           160
|  |  |  |  |- listeners java.util.Collections$SynchronizedList @ 0x787a9e190       |           104
----------------------------------------------------------------------------------------------------

我知道我在这里可能做些愚蠢的事情,但是我认为通过遵循最大的保留大小(或跳过循环第二大的保留),我会发现这个问题的真正坏蛋。但是我找不到其他任何具有相似保留大小的保留对象集来将我指向下一个可疑对象(会话的原始保留大小除外)。

在Java 8,HotSpot JVM上运行

1 个答案:

答案 0 :(得分:0)

是的,您遵循了从HashedSession @ 0x77d47bf70回到HashedSession @ 0x77d47bf70的循环引用。但是,您没有完全浏览_attributes HashMap。里面还有什么?

您是否通过右键单击HashedSession @ 0x77d47bf70使用“列表对象->外发引用”?