GC 在循环中



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

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();

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

最新更新