我有一个应用程序,在Amazon EC2上运行(使用多个AWS产品,如S3、DynamoDB等),并存在内存泄漏问题。我收集了一些堆转储,并通过Eclipse的Memory Analyzer Tool运行它们,该工具指出数百个可能是泄漏的sun.security.ssl.SSLSocketImpl
实例(占用了数十MB的内存)。
然而,我遇到了难题,无法确定为什么这些SSLSocketImpl
对象没有被释放。
堆转储中大多数SSLSocketImpl
实例都有两个引用,一个来自java.lang.ref.Finalizer
,另一个来自com.amazonaws.internal.SdkSSLSocket
。我的堆转储中的Finalizer线程被报告为空闲状态,没有对象等待终结。但对于那些与泄漏的SSLSocketImpl
对象相关的com.amazonaws.internal.SdkSSLSocket
对象似乎已经被清理了。至少在MAT中的支配者视图中找不到它们。
我是分析Java堆转储的新手。接下来我应该寻找什么?如果Amazon的SdkSSLSocket
对象确实被清理,为什么SSLSocketImpl
对象没有被清理?
谢谢!