我有一个应用程序,如果我下载几个条目,然后下载我的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)
答案 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之间流式传输内容,而不是尝试将整个内容放在变量中。