Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免Java中的char[]垃圾?_Java_String_Garbage Collection - Fatal编程技术网

如何避免Java中的char[]垃圾?

如何避免Java中的char[]垃圾?,java,string,garbage-collection,Java,String,Garbage Collection,我的应用程序构造非常长的字符串(每个大约30000个字符)。由于这个原因,我的内存不足,而且我看到有很多垃圾收集char[]对象。这是因为我正在使用Stringbuilder,它可能在内部使用char[] 此外,这个巨大字符串的主要部分是固定的(比如29800个字符)。所以,变化的只是剩下的部分。如果我创建一个静态字符串,然后将它们连接起来,我仍然会得到相同的GC结果,因为“+”在内部被编译为StringBuilder 有没有一种在Java中构造长字符串的有效方法,而无需GCing 编辑: 一些

我的应用程序构造非常长的字符串(每个大约30000个字符)。由于这个原因,我的内存不足,而且我看到有很多垃圾收集
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个这样的字符串,可能还有其他操作(如连接)在它们上面发生,这造成了问题。