【问题标题】:Java Heap Space Error while reading large files读取大文件时出现 Java 堆空间错误
【发布时间】:2013-06-28 23:12:41
【问题描述】:

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

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

【问题讨论】:

    标签: java file-io inputstream heap-memory apache-commons-io


    【解决方案1】:

    您应该将is 传递给需要数据的类。只要你不一次读入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
    }
    

    【讨论】:

    • 但是其他类只接受字符串作为参数。hter类实际上是IBM预先编写的类,我只接受字符串作为参数
    • @user2535809 所以将其更改为将InputStream 作为参数。你能做到吗?
    • 不。这是正在谈论的课程“com.ibm.cognos.manyeyes.container.VisualizationRenderer;”。无论如何都可以这样做,而无需将整个文件加载到主内存中跨度>
    • @user2535809 我不知道那是什么。请把我链接到文档。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      -Xmx<size>
      

      例如,您可以使用这样的设置为您的 JVM 提供 2GB 的最大堆

      -Xmx2g
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        • 2015-02-22
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 2013-05-03
        • 1970-01-01
        相关资源
        最近更新 更多