我有一个应用程序(Springboot API)运行un kubernetes,我有一个cpu:200m
和memory:8Gi
的示例。我的jvm参数是:_JAVA_OPTIONS: -Xmx7G -Xms7G
我的目标是将一个或多个大小在30Mb和1Gb之间的文件从一个s3 bucket复制到另一个带有预签名url的s3 bucket。
我得到java.lang.OutOfMemoryError: Java heap space
错误时,我调用我的API超过2次在1GB的文件目录。
下面是我的代码:
public ResponseEntity<String> transferData(Config config) throws IOException {
var inputUrl = config.getInputdUrl();
var outputUrl = config.getOutputdUrl();
var uploadConnection = uploader.getUploadConnection(outputUrl);
try (var inputStream = downloader.getDownloadConnection(inputUrl);
var outputStream = uploadConnection.getOutputStream()) {
IOUtils.copyLarge(inputStream, outputStream);
var resp = uploadConnection.getResponseCode();
return ResponseEntity
.status(HttpStatus.OK)
.body("Transfer done with response:" + resp);
} catch (IOException ioe) {
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("An error occurred while transferring data : " + ioe);
}
}
字符串getUploadConnection
返回HttpURLConnection
:
var connection = (HttpURLConnection) new URL(presignedUrl).openConnection();
connection.setDoOutput(true);
connection.setRequestMethod(PUT.toString());
return connection;
型getDownloadConnection
返回HttpURLConnection
inputStream。
HttpURLConnection connection = (HttpURLConnection) new URL(presignedUrl).openConnection();
connection.setRequestMethod(GET.toString());
connection.setDoOutput(true);
return connection.getInputStream();
型
关于我的代码和配置,我认为对内存的影响不太重要,因为我流文件,并没有得到它完全在内存中。
我错过了什么?
编辑1:我添加了setChunkedStreamingMode
,所以现在我的getUploadConnection
返回:
var connection = (HttpURLConnection) new URL(url).openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setChunkedStreamingMode(-1);
connection.setRequestMethod(PUT.toString());
return connection;
型
但是我从我的s3 bucket得到一个411
错误
1条答案
按热度按时间xn1cxnb41#
在我的输出连接中设置了
setFixedLengthStreamingMode
,我能够传输更多的文件,而不会出现Out of memory error java heap space
问题。我的输出连接:
字符串