2017-02-27 36 views
0

下面的情況會導致內存泄漏嗎?下面的情況會導致內存泄漏嗎?

案例1

在這裏,我沒有使用新的運營商,因此我不知道它是如何工作在Java中,當我們沒有用戶新的運營商做的object1分配對象2。

public void doSomething() { 
    String a1 = "Hello"; 
    String a2; 

    while(true) { 
     a2 = a1; 
    } 
} 

案例2

這裏,

public void doSomething() { 
    String a1 = new String("Hello"); 
    String a2; 

    while(true) { 
     a2 = new String(a1); 
    } 
} 
+3

兩者都不會導致內存泄漏。第二個例子*可能會讓垃圾收集器很忙。 – shmosel

+0

1)否,分配給另一個變量的引用不會分配更多的空間。 2)否,在循環的每次迭代中創建的新字符串只要在下一次迭代中重寫引用時就可以被垃圾回收。它會觸發許多GC運行,釋放空間,但它不是泄漏內存。 – Andreas

回答

0

案例1

你沒有分配任何更多的內存,所以你不能泄露任何。在一個循環之後,變量a1a2將引用完全相同的單個String實例。

案例2

沒有,因爲它代表所有String情況下,你正在創建只會被垃圾收集,但你並不遙遠:

while(true) { 
    a2 = new String(a1); 
    a2.intern(); 
} 

通過將字符串中的PermGen (永久代),然後失去對它的任何引用(在下一個循環迭代中),這將歸類爲內存泄漏。