我有一个程序可以写入然后将大量SQL语句压缩到一个文件中。但是,有时用户可以选择大量项目来生成SQL语句。例如,SQL zip文件可能包含4个文件,每个文件长度超过1百万个字符。
目前SQL生成依赖于函数:
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
然而,这会导致内存使用量大幅增加,并导致程序因“java.lang.OutOfMemoryError:Java堆空间”错误而崩溃。我已经尝试增加堆大小,但程序仍然很慢,但偶尔会崩溃。
有没有办法减少上述方法的内存消耗?它需要是整个对象作为字符串输出(而不仅仅是它的名称).Below是应用程序启动,闲置一段时间然后尝试在崩溃之前运行的图形。
以下是使用内存的内容:
答案 0 :(得分:1)
我遇到了同样的错误(" java.lang.OutOfMemoryError:Java堆空间"):
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
在抽象超类中。
在我阅读Apache Commons Lang3 documentation之后,我通过使用不使用反射的函数来解决问题,并且据说更快:
@Override
public String toString() {
return new ToStringBuilder(this).append("id",id).toString();
}
其中id
显然是我要输出的超类中的一个字段。
这解决了堆溢出的问题,现在我的应用程序运行得更快。
唯一的缺点是toString
输出现在变得更加简单,但无论如何这只用于调试,所以它不是什么大问题。