【问题标题】:Would below scenario cause a memory leak?以下情况会导致内存泄漏吗?
【发布时间】:2017-02-27 22:20:17
【问题描述】:

以下情况会导致内存泄漏吗?

案例 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) 不,分配对另一个变量的引用不会分配更多空间。 2) 不,只要在下一次迭代中覆盖引用,就可以对循环的每次迭代中创建的新字符串进行垃圾收集。它会触发多次 GC 运行,以释放空间,但不会泄漏内存。

标签: java memory-leaks


【解决方案1】:

案例一

您不再分配任何内存,因此您不会泄漏任何内存。一个循环后,变量a1a2 将引用完全相同的单个String 实例。

案例 2

不,就目前而言,您创建的所有 String 实例都将被垃圾收集,但您离我们不远了:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多