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