gpt4 book ai didi

java - 当循环重新开始时,循环内的局部变量会被销毁吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:32:55 24 4
gpt4 key购买 nike

while(condition){
int n=1;
}

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

最佳答案

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

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

请注意,int 变量是原始类型,而不是对象引用:您不能将 null 分配给它。


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

变量总是其他事物的一部分:它可能是对象中的字段、类中的静态字段或方法中的局部变量。当包含对象被垃圾回收时,对象中的字段会释放内存,而类中的静态字段会在类被卸载时释放(尽管这通常要到整个程序结束才会发生)。但是方法内的局部变量存储在方法的栈帧中,在方法调用时分配,方法返回时释放。

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

关于java - 当循环重新开始时,循环内的局部变量会被销毁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33643468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com