字符串连接OutOfMemoryError

时间:2015-08-07 05:14:16

标签: java memory-management memory-leaks

我正在摆弄Java.lang.String并使用' +'操作员对他们。我很想知道为什么获得以下输出:

使用下面的代码,我可以获得数千次迭代,并且不会抛出任何内存异常:

public static void main(String[] args) {
        String str = "hello";
        int count = 1;
        while (true) {
            System.out.println(count++);
            str = str + "newString";
        }
    }

但是,当我添加' str'对于它自己,我在20-30次迭代后得到OutOfMemoryError异常:

public static void main(String[] args) {
        String str = "hello";
        int count = 1;
        while (true) {
            System.out.println(count++);
            str = str + "newString" +str;
        }
    }

我在32位操作系统上使用eclipse而没有其他参数,例如Xms或Xmx

2 个答案:

答案 0 :(得分:6)

如果你这样做

str = str + "newString";

你的字符串在每次迭代时线性增长9个字符。

Iteration    String length
1            5
2            14
3            23
4            32
5            41
6            50
...
30           266

另一方面,如果你这样做

str = str + "newString" + str;

你的字符串呈指数级增长。它在每次迭代时变为两倍+9个字符。

Iteration    String length
1            5
2            19
3            47
4            103
5            215
6            439
...
30           7516192759

答案 1 :(得分:0)

只是一个数学:

pow(2,20)远远超过几千。 该字符串长度为5个字符,您可以在每个循环步骤中将其加倍。经过20步后你的字符串是(没有附加“newString”字符串)5 * pow(2,20)长。这是5 242 880个字符的长度,并且在第一个循环中远远超过5 + 9 * 1000 = 45000个字符。

编辑来纠正:在第二个循环中你有5 * pow(2,20)+ 9 * sum(pow(2,i),i,0,19)。