下载文件时堆空间异常

时间:2012-03-23 12:49:54

标签: java

我有一个应用程序,如果我下载几个条目,然后下载我的csv文件工作正常....但如果有很多条目,有java异常,并在调试它给出vmdisconnected异常。 我试图在名为

的变量中获取所有数据
String content = service.generateCSV(SearchVO);

这个内容变量是在动作类中设置的,然后我有一个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)

3 个答案:

答案 0 :(得分:1)

您的问题似乎是您尝试处理的内容太大而无法在内存中使用一次。

解决该问题的一种方法可能是逐步(例如逐行)读取源(并处理数据),而不是一次读取所有源。

这是一个如何逐步(逐行)从网址读取文件并将其复制到另一个文件的示例:

            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();
            }

答案 1 :(得分:0)

如果你的堆空间不足,你需要增加它。 以下是关于如何做以及如何避免常见错误的精彩内容:

http://javahowto.blogspot.com/2006/06/6-common-errors-in-setting-java-heap.html

答案 2 :(得分:0)

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

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