Java while循环中的GC

Java while循环中的GC,java,jenkins,groovy,Java,Jenkins,Groovy,我尝试在jenkins上运行以下代码,将文件转换为字符串,然后将字符串转换为字节流。jenkins作业因OutOfMemoryError[java.lang.OutOfMemoryError:java堆空间]而失败。如何在while循环中进行垃圾收集以避免OutOfMemoryError String content = steps.readFile("doc_html.tar.gz") InputStream inp = null inp = new ByteArrayInputStream(

我尝试在jenkins上运行以下代码,将文件转换为字符串,然后将字符串转换为字节流。jenkins作业因OutOfMemoryError[java.lang.OutOfMemoryError:java堆空间]而失败。如何在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
,从文件中提取字节并对其进行处理,而不是首先将完整文件缓存在
字符串中

如果在内存中读取整个文件,则需要更改该文件,而不是弄乱gc。@luk2302替代方法是什么?我应该按部分阅读文件吗?我怎么做?抱歉,我是个新手。使用某种
BufferedInputStream
,问题出在
steps.readFile(“doc_html.tar.gz”)
。@luk2302我的问题是fileinputstream在jenkins从机中找不到文件,所以我读取文件的唯一方法是steps.readFile()。如果我想使用BufferedInputStream,我需要一个用于构造函数的输入流,但我不知道如何创建输入流。您使用的是Jenkins管道吗?在这种情况下,我不能使用FileInputStream,因为FileInputStream在Jenkins从机的工作区中找不到该文件,相反,它只能在jenkins的主服务器中找到文件。那么您现在是如何读取文件的(步骤是什么类型的)?在我看来,如果您的jenkins设置似乎存在某种缺陷,
FileInputStream
实际上应该可以工作。“在管道描述中使用java.io.File不能像管道一样工作,当您想在构建完成的从机上写/读/测试文件时,它自己在主机上执行。”当我使用FileInputStream时,它的构造函数将使用新文件(filename)创建一个file对象,该文件不会从工作区读取该文件。