【问题标题】:are local variables made inside a loop destroyed when the loop starts over?当循环重新开始时,循环内的局部变量会被破坏吗?
【发布时间】:2015-11-11 02:49:15
【问题描述】:
while(condition){
    int n=1;
}

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

【问题讨论】:

  • 变量所代表的内存设置为“null”状态
  • 有一个简单的方法可以找到 - 查看生成的 Java 操作码。
  • 看看这个答案stackoverflow.com/questions/8803674/…我想它解释了一切。
  • 你有充分的理由声明 n 吗?

标签: java loops memory


【解决方案1】:

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

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

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


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

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

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

【讨论】:

  • 我知道您不能将 null 分配给原始类型,但您理解我要解释的内容。
  • 这个答案为我解决了问题。您是否知道在 JLS 中指定循环中声明的变量不在迭代之间共享(您的第一条语句)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多