Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用aws s3客户端时Tomcat不卸载类_Java_Amazon S3_Tomcat8_Heap Memory_Permgen - Fatal编程技术网

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

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

在使用JavaAWSS3客户端时,我发现了一个奇怪的问题。当我进行多重部署时,不会重新启动STOMCAT,只更新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
        }
    }
}

当应用程序被取消部署时,我如何卸载这些类。

正如我在之前的评论中所发布的,我发现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]”的线程