【问题标题】:Reduce memory usage of ToStringBuilder (apache commons)?减少 ToStringBuilder (apache commons) 的内存使用?
【发布时间】:2015-03-07 05:48:48
【问题描述】:

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

目前SQL生成依赖于函数:

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

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

有没有办法减少上述方法的内存消耗?它必须是作为字符串输出的整个对象(不仅仅是它的名称)。下面是应用程序启动的图表,空闲了一会儿,然后在崩溃前尝试运行。

这是使用内存的内容:

【问题讨论】:

  • 一些信息,让您有根据的猜测。你能提供你的文件编写代码吗?
  • 您应该在这里改变您的方法,我认为如果您使用 File 对象来存储该 sql 的结果将解决您的问题,也最好从 File 对象编写 zip。
  • 因为ToStringBuilder 只接受StringBuffer 而不是输出流,它似乎需要您将整个对象字符串保存在内存中,直到写入文件。您可能会研究一种不同的方法,该方法允许您在解析 pojo 时转储字符串。

标签: java string memory tostring apache-commons


【解决方案1】:

我遇到了同样的错误(“java.lang.OutOfMemoryError: Java heap space”):

@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 的输出现在要简单得多,但无论如何这仅用于调试,所以没什么大不了的。

【讨论】:

  • @jnd 如果此答案对您有所帮助,请考虑将此答案标记为已接受。谢谢!
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多