我正在使用AWS S3客戶端從S3(大約600MB左右)下載大文件。但在下載過程中,下載失敗,出現錯誤,如Socket closed
或Premature end of Content-Length delimited message body
或Data received in non-data state: 6
。錯誤消息不斷從一個失敗變爲另一個失敗。在一點研究上,似乎會出現這樣的問題,AmazonS3
客戶端在輸入流被完全讀取和寫入之前得到垃圾回收。 https://forums.aws.amazon.com/thread.jspa?messageID=438171#方法退出前垃圾收集方法中的局部變量? :Java
這裏是代碼看起來像
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
需要較長時間才能完成被垃圾收集,然後才能完成並返回? writeBytes
方法中沒有提及s3Client
。
這就是我的想法,但我似乎無法找到方法拋出異常的任何其他可能的解釋。 – RandomQuestion
我不會那麼確定...代碼可能已經過優化,因爲在開始使用流之後,沒有提及s3Client,我相信沒有理由爲什麼它不能被gc化。只需在方法末尾添加一行,如's3Client.toString()',以強制JVM保留ref並查看是否有幫助。 – Renato
這是個好主意。我會嘗試的。 – RandomQuestion