我運行了這些代碼,並且遇到了一些問題,這有點奇怪。如果Java字符串是不可變的,並且StringBuilder是可變的,他們爲什麼會浪費我的代碼中相同數量的內存?
使用字符串:
while(true)
{
String s = String.valueOf(System.currentTimeMillis());
System.out.println(s);
Thread.sleep(10);
}
使用StringBuilder的:
StringBuilder s = null;
while(true)
{
s = new StringBuilder();
s.append(System.currentTimeInMillis());
System.out.println(s);
Thread.sleep(10);
}
在他們被困在12540ķ浪費內存兩種情況。在Windows XP SP2上運行此測試。
他們爲什麼浪費相同數量的內存? 爲什麼不可變的字符串停止浪費內存? 題外話:如何將StringBuilder
轉換爲以特定字符集編碼的字節數組?
沒有100%你是問。上述兩者都不會導致任何「浪費」或泄漏的記憶。 12540k可能只是JVM使用的基本內存或還沒有被清理的瞬態內存。 – 2010-10-19 11:04:56
爲什麼不可變類會浪費內存? (而且可變嗎?) – Ishtar 2010-10-19 11:08:16
我讀過常見的字符串,垃圾回收器從來沒有收集過,是否是假的? – fredcrs 2010-10-19 11:12:04