【发布时间】:2016-09-16 02:17:06
【问题描述】:
在我的应用程序中有一个堆转储,令人惊讶的是char[] 保留的堆大约是 700MB,这很奇怪(至少对我来说)。同时String只有150MB。
在我的应用程序中,我只使用了StringBuilder(使用默认的StringBuilder 构造函数)并尽量避免使用String,因为我们正在附加数据。
我的问题是:我们是否应该一直选择StringBuilder?如果是,我们如何减少它保留的堆?
【问题讨论】:
-
如果你总是使用
StringBuilder的默认构造函数,它可能需要在你填充它们时继续在内部分配更大的char[]实例(大约需要两次空间就好像预先知道最终的大小一样)。但可能更重要的是,当你构建最终的String时,StringBuilder中的char[]必须被复制。 -
您可能希望在完成附加后从
StringBuilder中取出已完成的String,然后将StringBuilder扔掉。 -
@Andy Turner:我们将所有 String 变量声明为 final,因为它们都是局部变量。
-
@SauravKumarMehta:如果这是占用空间大的原因,那么我不会担心,因为内存实际上是“可用的”(即使它仍在物理内存中),因为它可以在必要时进行垃圾收集。
标签: java string stringbuilder heap-memory