tencentyun / cos-java-sdk-v5

java sdk for qcloud cos v5 (xml api)
MIT License
155 stars 142 forks source link

COSClient多次实例化出现内存泄漏,无法回收内存 #33

Closed forgetmetoo closed 5 years ago

forgetmetoo commented 5 years ago

程序中未使用单例模式,每次连接都重新new一个COSClient对象,jvm占用内存一直升高,不会自动回收,直到出现OOM。怀疑内部存在引用未释放。 修改COSClient为单例模式调用之后,经过压测,内存基本保持稳定。 但使用临时密钥初始化时,需要将临时密钥初始化进去,因此需要有这种应用场景,多次创建对象的情况。

liuyongqing commented 5 years ago

您好,CosClient反复创建,jvm占用内存过高,能提供一下相关代码、函数调用栈、top输出以及jmap输出吗,我这边按照如下的程序没有复现出您的问题:

 for(int i = 0; i <10000; i++) {
            BasicSessionCredentials credentials;
            if(i % 2 == 0) {
                credentials = new BasicSessionCredentials(secretId1, secretKey1, sessionToken1);
            } else {
                credentials = new BasicSessionCredentials(secretId2, secretKey2, sessionToken2);
            }
            COSClient cosClient = new COSClient(credentials, clientConfig);
            cosClient.doesObjectExist(bucketName, key);
            System.out.println(i);
            cosClient.shutdown();
        }

此外,更换临时密钥无需每一次都创建一个CosClient,只需要调用CosClient的setCOSCredentialsProvider方法设置为新的密钥即可`

forgetmetoo commented 5 years ago

不好意思,我后面排查到原因了,是我忘记执行shutdown()方法了。 后面我使用原来的多例调用,加上shutdown()方法后,也正常了,谢谢。