如何避免Java中的char[]垃圾?
我的应用程序构造非常长的字符串(每个大约30000个字符)。由于这个原因,我的内存不足,而且我看到有很多垃圾收集如何避免Java中的char[]垃圾?,java,string,garbage-collection,Java,String,Garbage Collection,我的应用程序构造非常长的字符串(每个大约30000个字符)。由于这个原因,我的内存不足,而且我看到有很多垃圾收集char[]对象。这是因为我正在使用Stringbuilder,它可能在内部使用char[] 此外,这个巨大字符串的主要部分是固定的(比如29800个字符)。所以,变化的只是剩下的部分。如果我创建一个静态字符串,然后将它们连接起来,我仍然会得到相同的GC结果,因为“+”在内部被编译为StringBuilder 有没有一种在Java中构造长字符串的有效方法,而无需GCing 编辑: 一些
char[]
对象。这是因为我正在使用Stringbuilder,它可能在内部使用char[]
此外,这个巨大字符串的主要部分是固定的(比如29800个字符)。所以,变化的只是剩下的部分。如果我创建一个静态字符串,然后将它们连接起来,我仍然会得到相同的GC结果,因为“+”在内部被编译为StringBuilder
有没有一种在Java中构造长字符串的有效方法,而无需GCing
编辑:
一些示例(伪)代码段:
private static String getString() {
StringBuilder sb = getStringBufferFromPool();
sb.append(<variable_part>);
sb.append(<constant_part>);
return sb.toString();
}
private静态字符串getString(){
StringBuilder sb=getStringBufferFromPool();
某人附加();
某人附加();
使某人返回字符串();
}
您是否尝试过设置更大的堆大小?如何显示一些相关的代码。30k字符是60kbytes,在内存成为真正的问题之前,您也可以创建很多这样的字符串。短命对象是高效的GC对象,因此字符串连接并没有那么糟糕,除非你在一个紧密的循环中进行。30k字符不多,但你可以改为写入一个文件(通过在执行过程中写入一个文件来使用更少的内存)@McN:是的,我已经将堆大小设置为8 GB。我也用Jprofiler分析了我的代码,它显示了在创建长字符串的过程中char[]对象的增长速度非常快。@Kayaman:有20000个这样的字符串,可能还有其他操作(如连接)发生在它们上面,这会产生问题。您是否尝试过设置更大的堆大小?如何显示一些相关代码。30k字符是60kbytes,在内存成为真正的问题之前,您也可以创建很多这样的字符串。短命对象是高效的GC对象,因此字符串连接并没有那么糟糕,除非你在一个紧密的循环中进行。30k字符不多,但你可以改为写入一个文件(通过在执行过程中写入一个文件来使用更少的内存)@McN:是的,我已经将堆大小设置为8 GB。我也用Jprofiler分析了我的代码,它显示了在创建长字符串的过程中char[]对象的增长速度非常快。@Kayaman:有20000个这样的字符串,可能还有其他操作(如连接)在它们上面发生,这造成了问题。