减少ToStringBuilder(apache commons)的内存使用量?

时间:2015-01-08 23:40:22

标签: java string memory tostring apache-commons

我有一个程序可以写入然后将大量SQL语句压缩到一个文件中。但是,有时用户可以选择大量项目来生成SQL语句。例如,SQL zip文件可能包含4个文件,每个文件长度超过1百万个字符。

目前SQL生成依赖于函数:

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}

然而,这会导致内存使用量大幅增加,并导致程序因“java.lang.OutOfMemoryError:Java堆空间”错误而崩溃。我已经尝试增加堆大小,但程序仍然很慢,但偶尔会崩溃。

有没有办法减少上述方法的内存消耗?它需要是整个对象作为字符串输出(而不仅仅是它的名称).Below是应用程序启动,闲置一段时间然后尝试在崩溃之前运行的图形。 enter image description here

以下是使用内存的内容: enter image description here

1 个答案:

答案 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输出现在变得更加简单,但无论如何这只用于调试,所以它不是什么大问题。