当前位置: 首页 > 知识库问答 >
问题:

读取大文件时出现 Java 堆空间错误

周飞语
2023-03-14

我试图将整个文件作为字符串对象加载到内存中。但是在应用程序结束后,我的内存不会被释放回垃圾收集器。我知道在内存中读取整个文件是不好的,但是我必须将数据发送到另一个类,有人能帮助我如何做这只是一个流,而不是将整个代码加载到内存中,如果没有,有人能说我现在的代码有什么问题吗

private   String processFile(FileItemStream item) throws IOException{

        InputStream is=null;

        try{
            is=item.openStream();
            return IOUtils.toString(is, "UTF-8");
        }
        finally {

            IOUtils.closeQuietly(is);

        }

    }




data=processFile(item)//method call
SomeClass(data);//passing the data string to this class

共有3个答案

支彭亮
2023-03-14

如果您确实无法更改您正在调用的API以获取字符串之外的内容,那么您需要通过为JVM提供更多内存来解决这个问题。这可以通过向JVM发送参数来更改。

-Xmx<size>

例如,您可以使用这样的设置给JVM一个最大2GB的堆

-Xmx2g

但是如果您使用的API接受一个字符串作为参数,并且试图传递一个几千兆字节的字符串,那么您几乎肯定是错误地使用了他们的API。如果有人构建一个需要大量数据的API,他们不会用单个字符串作为参数来构建它。祝你好运。

经俊茂
2023-03-14

这取决于您可以使用的API。如果他们的API允许您一次处理一个字节数组的数据,那么您应该将数据块读入一个缓冲区,并将其发送给那个应用程序。如果它让你传入一个InputStream,那么你应该这样做。

如果 API 不允许您执行上述操作之一,那么您唯一可以做的就是增加 Java 可以使用的内存量。为此,请使用 -Xmx512m 开关启动 Java,其中 512 是可以分配给 Java 的内存量。

宋稳
2023-03-14

您应该将 is 传递到需要数据的类中。只要你没有一次读懂所有的内容,你就不会用完你所有的内存。将您的代码更改为以下内容:

InputStream is = null;
try {
    is = getFileAsStream(item);
    SomeClass(is)  //of course this probably doesn't compile, I'm just using your code sample
} finally {
    //close is
}
 类似资料:
  • 当项目由cordova构建时,我得到了Java堆空间错误。该错误是在我将AdmobFree和SocialSharing Plugings安装到项目中时开始的。 我尝试使用cmd命令增加堆空间,但这对我没有帮助。项目看起来编译成功,但我无法在Android Studio上运行。我希望你能帮助我。问候 科尔多瓦构建android检查JavaJDK和Android SDK版本ANDROID_SDK_RO

  • 我正在写一个小程序,可以处理大的(最多无限个)文本文件。处理过程将相当简单(将部分内容修剪并处理成单独的字符串,然后打印出来)。然而,由于数据的长度可能是无限的,我可能会遇到超过堆的问题。我想到的第一个解决方案是使用流来处理数据。然而,Files类中的lines()方法只能将文本分成行。我的线条也可以无限长! 我遇到的另一个解决方案是使用scanner useDelimiter方法: 这种方法会阻

  • 可能没有多少开发人员像我一样面临这个问题<但是我想分享我已经解决了将近一个月的解决方案 我使用Kubernetes和docker compose,此Webflux服务(容器)设置了内存限制1g

  • 在Ubuntu中,当我运行hadoop示例时: 在日志中,我得到的错误为: 信息映射。JobClient:任务Id:尝试\u 201303251213\u 0012\u m\u000000 \u 2,状态:失败错误:Java堆空间13/03/25 15:03:43信息映射。JobClient:任务Id:trunt\u 201303251213\u 0012\u m\00000 1\u 2,状态:F

  • 需要帮助修复此错误。我试图打印出字符串国家名称的数组长度。 我从一个简历文件阅读,我一直得到上面的错误。下面是我的代码: 下面是我的TestCSV类文件: 我的csv文件如下所示:这是一个摘要,因为我不想打印出全部252个国家。基本上,我把252个国家的数据存储在一个字符串数组中,年份存储在一个整数数组中,每个国家的蜂窝数据统计数据存储在一个二维双数组中。我是编程新手,我想知道我的方向是否正确,如

  • 我返回了一个代码,使用jsoup-1.7.3.jar读取网页,它对一些网站有效,但对一些URL显示读取超时错误。 线程“main”java.net.SocketTimeoutException中的异常:java.net.SocketInputStream.socketRead0(本机方法)处java.net.SocketInputStream.Read(SocketInputStream.java