使用JAVA AWS s3客户端时,我发现了一个奇怪的问题。当我进行多次部署(tomcat未重新启动,只更新war文件)时,堆大小保持不变,但非堆大小不断增加。事实证明,在取消部署应用程序时,不会卸载类。
我的应用程序有一个简单的上下文监听器,它初始化AWS S3客户端并在应用程序上下文被销毁时将其关闭。
以下是代码:
@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
}
}
}
如何在取消部署应用程序时卸载类。
答案 0 :(得分:0)
正如我在之前的评论中所发表的那样,我发现AwsSdkMetrics bean是罪魁祸首。 所以我在contextDestroyed方法
中添加了这个语句AwsSdkMetrics.unregisterMetricAdminMBean();
取消注册MetricAdminMBean。
非常感谢马蒂亚斯建议他出色的图书馆帮我找出根本原因。