Java 下面的场景会导致内存泄漏吗?

Java 下面的场景会导致内存泄漏吗?,java,memory-leaks,Java,Memory Leaks,下面的场景会导致内存泄漏吗 案例1 在这里,我不使用new操作符,因此我不确定当我们不使用new操作符并将object1赋值给object2时,它在Java中是如何工作的 public void doSomething() { String a1 = "Hello"; String a2; while(true) { a2 = a1; } } 案例2 这里, public void doSomething() { Stri

下面的场景会导致内存泄漏吗

案例1

在这里,我不使用new操作符,因此我不确定当我们不使用new操作符并将object1赋值给object2时,它在Java中是如何工作的

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);
     }
 }
案例1 你没有分配更多的内存,所以你不能泄漏任何内存。在一个循环之后,变量
a1
a2
将引用完全相同的单个
String
实例

案例2 不,就目前情况而言,您正在创建的所有
String
实例都将被垃圾收集,但您离垃圾收集不远了:

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

通过将字符串放置在垃圾收集器的PermGen(永久生成)中,然后丢失对它的任何引用(在下一个循环迭代中),这将被归类为内存泄漏。

两者都不会导致内存泄漏。第二个示例可能会使垃圾收集器保持忙碌。1)不,将引用分配给另一个变量不会分配更多空间。2) 不,在循环的每次迭代中创建的新字符串可以在下一次迭代中重写引用后立即进行垃圾收集。它将触发许多GC运行,以释放空间,但这不是内存泄漏。