Java 下载文件时出现堆空间异常

Java 下载文件时出现堆空间异常,java,Java,我有一个应用程序,如果我下载很少的条目,那么我的csv文件的下载工作正常……但是如果有很多条目,就会出现java异常,调试时会出现vmdisconnected异常。 我正在尝试获取名为 String content = service.generateCSV(SearchVO); 这个内容变量是在action类中设置的,然后我有一个downloadservlet类,在这个类中我得到这个内容变量 String content = (String) request.getAttribute(CON

我有一个应用程序,如果我下载很少的条目,那么我的csv文件的下载工作正常……但是如果有很多条目,就会出现java异常,调试时会出现vmdisconnected异常。 我正在尝试获取名为

String content = service.generateCSV(SearchVO);
这个内容变量是在action类中设置的,然后我有一个downloadservlet类,在这个类中我得到这个内容变量

String content = (String) request.getAttribute(CONTENT);
有人能建议我如何阅读内容,这样即使有很多条目,我也可以下载文件吗

这就是我从数据库获取数据的方式

    `while (sqlRowSet.next()) 
        {
  data = (DB2Xml) sqlRowSet.getObject(Constants.TABLE_NAME_XML);
   dl = data.getDB2XmlString();}
堆栈跟踪:-

java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.lang.StringBuffer.toString(Unknown Source)
at com.ibm.db2.jcc.c.fc.getDB2XmlString(fc.java:187)
java.lang.OutOfMemoryError:java堆空间
位于java.util.Arrays.copyOfRange(未知源)
位于java.lang.String。(未知源)
位于java.lang.StringBuffer.toString(未知源)
位于com.ibm.db2.jcc.c.fc.getDB2XmlString(fc.java:187)

如果堆空间不足,则需要增加堆空间。 下面是一本关于如何做以及如何避免常见错误的好书:


从广义上讲,您希望使用数据流,而不是将所有数据一次放入内存


它看起来像是
service.generateCSVContent
生成了一个巨大的字符串,从堆栈跟踪来看,它似乎来自一个DB2数据库?从2分钟的搜索来看,似乎有一个。也许使用它可以帮助解决你的问题。您只需要确保在A和B之间流式传输内容,而不是试图将整个内容放在一个变量中。

您的问题似乎是试图处理的源太大,无法在内存中一次性使用

String content = (String) request.getAttribute(CONTENT);
解决这个问题的一种方法是逐步(例如逐行)读取源代码(并处理数据),而不是一次性全部读取

下面是一个示例,说明如何逐步(逐行)从url读取文件并将其复制到另一个文件:

            URL url;
            try {
                url = new URL(location);
                BufferedReader in = new BufferedReader(
                                 new InputStreamReader(url.openStream()));
                BufferedWriter out = new BufferedWriter(new FileWriter(saveFile));
                String buffer;
                while ((buffer = in.readLine()) != null) {
                    out.write(buffer);
                    // write the file or do whatever you want with it

                }
                in.close();
                out.close();

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

请发布java异常。请提供更多代码。如果您需要帮助,请格式化您的代码等。我相信您正在一个内存块中存储大量数据。提供更多代码和Exception-Stacktrace.@ckuetbach.yes我正在将所有数据存储在内容变量中…你能建议我如何逐流获取数据…这里是A和B…我不想搞乱db,因为我对搜索结果使用相同的数据库查询A可能就是数据库。以流的形式从数据库中获取内容(例如,一条记录一条记录,而不是一次获取所有内容)。B是您在另一端使用它所做的任何事情(例如,生成CSV文件)。逐行生成,而不是一次生成所有。