使用泄漏的SSLSocketImpl分析堆转储

ur-*_*gel 8 java memory-leaks amazon-web-services heap-dump

我有一个在Amazon EC2上运行的应用程序(使用多种AWS产品,如S3,DynamoDB等)并且存在内存泄漏.我收集了一些堆转储,并通过Eclipse的Memory Analyzer工具运行它们,该工具将数百个实例sun.security.ssl.SSLSocketImpl(占用几十MB的内存)确定为可能的泄漏.

我无法弄清楚为什么这些SSLSocketImpl物体没有被处理掉.

SSLSocketImpl转储中的大多数实例都有两个引用,一个来自java.lang.ref.Finalizer,一个来自com.amazonaws.internal.SdkSSLSocket.我的堆转储中的Finalizer线程报告为空闲,没有任何对象等待完成.但是已经清理了com.amazonaws.internal.SdkSSLSocket引用泄漏SSLSocketImpl对象的对象.至少,我在堆转储中找不到它们(MAT中的Dominator视图).

我是分析Java堆转储的新手.我接下来应该寻找什么?如果SdkSSLSocket确实已经清理了亚马逊对象,为什么这些SSLSocketImpl对象也没有被清除?

谢谢!

小智 3

这可能是因为未设置 SSL 会话缓存大小,默认情况下该大小是无限的,最终可能会消耗大量堆空间。设置 javax.net.ssl.sessionCacheSize = 1000 应该有所帮助。