堆:幸存者空间

gos*_*sua 1 java memory heap

我写了一个示例java应用程序,它分配内存然后永远运行.
为什么幸存者空间使用的内存为0kbytes?

    List<String> stringlist = new ArrayList<String>();

    while (true) {
        stringlist.add("test");
        if (stringlist.size() >= 5000000)
            break;
    }

    while (true)
        for (String s : stringlist);
Run Code Online (Sandbox Code Playgroud)

And*_*ndy 7

因为"test"是一个字符串文字,它最终将永久存储在堆中.您创建的对象的内存大小为5000000 + 4*2~5MB,可轻松融入Eden空间.

修改

stringlist.add("test");
Run Code Online (Sandbox Code Playgroud)

stringlist.add(new String("test"));
Run Code Online (Sandbox Code Playgroud)

你会得到5000000*4*2 = 38MB,这很可能仍然适合伊甸园.您可以增加列表大小或字符串长度,以确保您有幸存者.