使用aws s3客户端时,Tomcat不会卸载类

时间:2018-04-18 14:16:09

标签: java amazon-s3 tomcat8 heap-memory permgen

使用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
        }
    }
}

如何在取消部署应用程序时卸载类。

1 个答案:

答案 0 :(得分:0)

正如我在之前的评论中所发表的那样,我发现AwsSdkMetrics bean是罪魁祸首。 所以我在contextDestroyed方法

中添加了这个语句

AwsSdkMetrics.unregisterMetricAdminMBean();

取消注册MetricAdminMBean。

非常感谢马蒂亚斯建议他出色的图书馆帮我找出根本原因。