是循环重启时被破坏的局部变量吗?

时间:2015-11-11 02:49:16

标签: java loops memory

while(condition){
    int n=1;
}

当循环重新开始时,变量n是否会被销毁(变量表示的内存被设置为“null”状态)或者第二次被声明占用更多内存并且它们不会被销毁直到循环退出?

1 个答案:

答案 0 :(得分:8)

在每次循环迭代结束时,变量超出范围并且不再存在。这并不意味着为其分配特殊值(例如null);它只是意味着内存可供其他东西使用。在任何理智的JVM实现中,循环的下一次迭代将重用内存中的相同位置(并将其值重新初始化为1),因此无论循环运行多少次迭代,您都将使用恒定的内存量。请注意,即使内存(可能)被重用,但每次技术上它都是一个不同的变量。

在循环结束之后,变量永远超出范围。它占用的内存通常是JVM为方法中使用的所有变量创建的“堆栈帧”的一部分,因此该方法仍在使用这四个字节,直到它返回,但它们可以重用于存储稍后在同一方法中创建的另一个变量(如果有的话)。

请注意,int变量是基本类型,而不是对象引用:您无法为其分配null

其他一些答案提到了垃圾收集。我想澄清一点,这实际上与此无关。 Objects 是垃圾收集的,但变量 - 包括引用对象的那些 - 不是。

变量始终是其他内容的一部分:它可能是对象中的字段,或类中的静态字段,或方法中的局部变量。当包含对象被垃圾收集时,对象中的字段释放其内存,并且在卸载类时释放类中的静态字段(尽管通常在整个程序结束之前不会发生)。但是方法中的局部变量存储在方法的堆栈帧中,该堆栈帧在调用方法时分配,并在方法返回时释放。

简而言之:垃圾收集用于查找不再需要的对象,但不需要在堆栈帧上进行垃圾收集,因为JVM确切地知道何时不再需要它们:当方法返回时。