Java 使用aws s3客户端时Tomcat不卸载类
在使用JavaAWSS3客户端时,我发现了一个奇怪的问题。当我进行多重部署时,不会重新启动STOMCAT,只更新war文件,堆大小保持不变,但非堆大小不断增加。结果表明,当应用程序取消部署时,类不会被卸载 我的应用程序有一个简单的上下文侦听器,它初始化AWS S3客户端,并在应用程序上下文被破坏时将其关闭 代码如下:Java 使用aws s3客户端时Tomcat不卸载类,java,amazon-s3,tomcat8,heap-memory,permgen,Java,Amazon S3,Tomcat8,Heap Memory,Permgen,在使用JavaAWSS3客户端时,我发现了一个奇怪的问题。当我进行多重部署时,不会重新启动STOMCAT,只更新war文件,堆大小保持不变,但非堆大小不断增加。结果表明,当应用程序取消部署时,类不会被卸载 我的应用程序有一个简单的上下文侦听器,它初始化AWS S3客户端,并在应用程序上下文被破坏时将其关闭 代码如下: @WebListener public class ContainerContextClosedHandler implements ServletContextListener
@WebListener
public class ContainerContextClosedHandler implements ServletContextListener {
private static AmazonS3 s3Client;
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
s3Client = AmazonS3ClientBuilder.standard().build();
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
try {
System.out.println("shutting down s3Client");
if (s3Client != null) {
s3Client.shutdown();
}
com.amazonaws.http.IdleConnectionReaper.shutdown();
} catch (Throwable t) {
// log the error
}
}
}
当应用程序被取消部署时,我如何卸载这些类。正如我在之前的评论中所发布的,我发现AwsSdkMetrics bean是罪魁祸首。 所以我在contextDestroyed方法中添加了这个语句 AwsSdkMetrics.unregisterMetricAdminBean 取消注册MetricAdminBean
非常感谢Mattias推荐了他精彩的库,帮助我找到了根本原因。嗨,Ajith,你能按照的说明进行操作吗?这样我们就可以了解泄漏的原因了?如果AWS S3库中确实存在泄漏,我希望在我的ClassLoader泄漏预防库中添加对该漏洞的支持Hi Mattias,我使用了您的库来检测泄漏。这是我在tomcat取消部署日志中得到的。se.jiderhamn.classloader.leak.prevention.JULLogger.warn MBean'com.amazonaws.management:type=AwsSdkMetrics'已由受保护的类加载器加载;未找到正在注销se.jiderhamn.classloader.leak.prevention.JULLogger.error java.beans.PropertyEditorManager的内部注册表,正在等待由contextClassLoade的受保护类加载器加载的类型为com.amazonaws.http.IdleConnectionReaper的线程“Thread[java sdk http connection reaper,5,main]”的线程