我有一个应用程序,如果我下载几个条目,那么我的csv文件的下载工作fine....but如果有很多条目,有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)发布于 2012-03-23 21:26:34
您的问题似乎是您试图处理的源太大,无法在内存中一次性使用。
解决这个问题的一种方法是逐步(例如逐行)读取源数据(并处理数据),而不是一次性读取所有数据。
这是一个从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();
}发布于 2012-03-23 20:54:52
如果堆空间即将耗尽,则需要增加堆空间。下面是关于如何做到这一点以及如何避免常见错误的一篇不错的读物:
http://javahowto.blogspot.com/2006/06/6-common-errors-in-setting-java-heap.html
发布于 2012-03-23 21:16:13
从广义上讲,您希望转向使用数据流,而不是一次性将所有数据放入内存。
它看起来像是service.generateCSVContent生成了一个巨大的字符串,并且从堆栈跟踪来看,这看起来像是来自DB2数据库?从2分钟的搜索看,似乎有一个stream-based API。也许使用它可以帮助解决你的问题。您只需要确保在A和B之间流式传输内容,而不是试图将所有内容放在一个变量中。
https://stackoverflow.com/questions/9839520
复制相似问题