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

And*_*460 4 java memory loops

while(condition){
    int n=1;
}
Run Code Online (Sandbox Code Playgroud)

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

Wyz*_*a-- 9

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

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

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


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

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

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