【发布时间】:2019-08-11 10:31:23
【问题描述】:
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 上运行
【问题讨论】:
标签: jvm out-of-memory vaadin heap-memory eclipse-memory-analyzer