在方法退出之前方法中的局部变量被垃圾收集? :Java

时间:2014-03-26 21:44:08

标签: java amazon-web-services garbage-collection

我正在使用AWS S3客户端从S3下载大文件(约600MB左右)。但是在下载过程中,下载失败,出现Socket closedPremature end of Content-Length delimited message bodyData received in non-data state: 6等错误。错误消息不断从一个故障变为另一个故障。在一点点研究中,当AmazonS3客户端在完全读取和写入输入流之前收集垃圾时,似乎会出现这样的问题。 https://forums.aws.amazon.com/thread.jspa?messageID=438171#

以下代码是什么

public void retrieve(String bucket, String key, String localFile){
    AmazonS3 s3Client = createNewS3Client();
    S3Object object = s3Client.getObject(bucket, key);

    InputStream inputStream = object.getObjectContent();
    OutputStream outputStream = new FileOutputStream(localFile);

    //read bytes from inputstream and write to outputstream until EOF
    writeBytes(inputStream, outputStream); 

    inputStream.close();
    outputStream.close();
}

所以我的问题是 - 如果方法s3Client需要更长的时间才能完成并且在它完成并返回之前,上述方法中的writeBytes是否可以被垃圾收集? s3Client方法中没有writeBytes的引用。

2 个答案:

答案 0 :(得分:0)

不,它不能。你可以在堆栈上找到它。

答案 1 :(得分:0)

在这里添加我的答案,这实际上解决了问题。

什么没有用? 为了避免垃圾收集,我在最后添加了一个使用s3Client对象的日志语句。

正如评论中的人所建议的那样,在课堂上s3Client选择一个字段是一种选择,但我无法做出改变。这可能已经解决了这个问题。

解决问题的原因是什么: 使用API​​ getObject(GetObjectRequest getObjectRequest, File destinationFile)。它负责流处理,从流中读取内容和写入文件。