首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下载文件时出现堆空间异常

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

Stack Overflow用户
提问于 2012-03-23 20:49:54
回答 3查看 825关注 0票数 0

我有一个应用程序,如果我下载几个条目,那么我的csv文件的下载工作fine....but如果有很多条目,有java异常,并在调试时,它是给出vmdisconnected异常。我正在尝试获取一个名为的变量中的所有数据

代码语言:javascript
复制
String content = service.generateCSV(SearchVO);

这个内容变量是在action类中设置的,然后我有一个downloadservlet类,在这个类中我获得了这个内容变量。

代码语言:javascript
复制
String content = (String) request.getAttribute(CONTENT);

有没有人可以建议我如何阅读内容,这样我就可以下载一个文件,即使它有很多条目

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

代码语言:javascript
复制
    `while (sqlRowSet.next()) 
        {
  data = (DB2Xml) sqlRowSet.getObject(Constants.TABLE_NAME_XML);
   dl = data.getDB2XmlString();}

堆栈跟踪:-

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2012-03-23 21:26:34

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

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

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

代码语言:javascript
复制
            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
EN

Stack Overflow用户

发布于 2012-03-23 20:54:52

如果堆空间即将耗尽,则需要增加堆空间。下面是关于如何做到这一点以及如何避免常见错误的一篇不错的读物:

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

票数 0
EN

Stack Overflow用户

发布于 2012-03-23 21:16:13

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9839520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档