GC在while循环中

问题描述 投票:0回答:1

我试图在jenkins上运行以下代码将文件转换为字符串,然后将字符串转换为字节流。由于OutOfMemoryError [java.lang.OutOfMemoryError:Java堆空间],jenkins作业失败。如何在while循环中进行垃圾收集以避免OutOfMemoryError?

String content = steps.readFile("doc_html.tar.gz")
InputStream inp = null
inp = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))

byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inp.read(buffer)) != -1) {
        outputStream.write(buffer);
}
outputStream.flush();
inp.close();
java jenkins groovy
1个回答
0
投票

垃圾收集的设计方式是,当您处于内存不足的状态时,如果可能的话,它会尝试释放更多内存。所以在大多数情况下,如果你的内存耗尽,它就不会,因为JVM没有调用垃圾收集器,而是因为你确实使用了太多的内存。在您的情况下,您将第一行中的整个文件读入内存。然后从内存中的文件字节创建输入流并处理字节。可能更适合你的是直接使用FileInputStream,从文件中流式传输字节并处理它们,而不是首先在String中缓存整个文件。

© www.soinside.com 2019 - 2024. All rights reserved.