代码之家  ›  专栏  ›  技术社区  ›  slim Deepak

Java的垃圾收集器会继续处理循环中声明的变量吗?

  •  6
  • slim Deepak  · 技术社区  · 14 年前

    如果我有:

    for (int i; i != 100; i++) {
        ArrayList<String> myList = buildList();
        //... more work here
    }
    

    在循环结束时,是否必须将myList设置为空,以使GC回收其用于myList的内存?

    5 回复  |  直到 14 年前
        1
  •  11
  •   Alan Geleynse buhbang    14 年前

    GC将自动清除不再在作用域中的任何变量。

    块内声明的变量(如for循环)将仅在该块内的作用域内。一旦代码退出块,GC将删除它。循环的一次迭代结束时就会发生这种情况,因此循环的每次迭代结束后,列表就有资格进行垃圾收集。

    i 在示例循环之后无效。

    请注意,只有在循环中使用变量时才会出现这种情况。如果将它传递给另一个保持对它的引用的方法,则不会对变量进行垃圾收集。

        2
  •  6
  •   Matt Ball    14 年前

    上帝,不!Java的GC非常多, , 许多的 比那更聪明。

        3
  •  3
  •   Ishtar    14 年前

    GC会在需要的时候回收所有无法访问的实例。它不是GC变量。

    i myList 住在烟囱上。当for循环结束时(当它们超出范围时),它们将被推离堆栈,从而回收它们的内存。然后变量就会消失。设置引用变量 迈利斯特 迈利斯特

    变量不会得到GCed,实例会。

        4
  •  3
  •   Mark Peters    14 年前

    这可能有助于理解for循环背后的语法。这在 JLS Section 14.14.1 .

    BasicForStatement:
        for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement
    
    ...
    
    Statement:
        StatementWithoutTrailingSubstatement
        ...
    
    StatementWithoutTrailingSubstatement:
        Block
        EmptyStatement
        ExpressionStatement
        ...
    
    
    Block:
        { BlockStatementsopt }
    
    BlockStatements:
        BlockStatement
        BlockStatements BlockStatement
    
    BlockStatement:
        LocalVariableDeclarationStatement
        ClassDeclaration
        Statement
    

    语句可以是单个语句,也可以是块(用大括号括起来的语句)。一个块表示一个新的词法范围,其中声明的变量仅是该块的本地变量。很多人没有意识到的是,这并不是for循环所独有的。我可以在方法中的任何位置放置块语句:

     public void someMethod() {
    
         {
             List<String> myList = new ArrayList<String>();
             System.out.println(myList);
         }
         System.out.println(myList.size()); //compile error: myList out of scope
     }
    

    无论如何,这不是我想要的。可以说,这与它是循环的事实关系不大,而与它是块的事实关系更大(如果选择不使用block语句,则不能声明新的局部变量,因此问题无关紧要)。

        5
  •  0
  •   Anant    14 年前

    你不必为垃圾烦恼。 Java GC将自动执行此操作。 但我的建议是,作为一个好的开发人员,你必须练习 为了清理垃圾。 因此,通过照顾我们自己,我们将明确地提高性能。