while循环中的空间分配
Posted
技术标签:
【中文标题】while循环中的空间分配【英文标题】:Space allocation in while loop 【发布时间】:2016-07-23 23:49:30 【问题描述】:考虑一个简单的while循环,如下所示
public static void main(String[] args)
int i = 6;
int k = 10;
while(i<k)
int v = 5;
i++;
变量v的空间是否只在while循环执行时分配,循环结束时释放?
或者不管while循环的终止或执行,它是否都留在内存中?
如果它不是原始数据类型(任何类型的对象)有什么不同吗?
【问题讨论】:
在这种情况下不会有任何内存分配,因为编译器很可能不会在编译后的字节码中包含未使用的变量。 所以变量v根本不会分配任何内存?即使正在执行while循环?那么如果 int v 被用于某个函数,它将如何获得它所持有的值呢? v 如何在没有内存分配的情况下存储一个值?变量存在于它们的作用域中(它们被声明的地方)并且在它们的作用域结束时可用于垃圾回收。 @Areca 我的第一句话是正确的吗?是真的吗? 分配是什么意思?对于像您的示例这样的原始数据类型,变量将在堆栈上分配,然后在堆栈上以很少的开销释放(请参阅***.com/questions/3646632/…)。如果它是使用new
创建的对象,那么就会有动态分配。
【参考方案1】:
JVM 在调用方法时创建一个新的frame。一个框架包含一个local variables 的数组。变量的数量在编译时确定。
在这种情况下,main
方法的框架将包含一个由 4 个局部变量组成的数组:args
、i
、k
和 v
。
【讨论】:
“框架”是否被视为某种记忆?那么我的第一个陈述是对还是错? “变量v的空间是不是只有在while循环执行时才分配,循环结束时才释放?” @LookAtTheBigPicture 仔细阅读:该框架将驻留在内存中(尽管不是堆),但由于该框架用于整个方法,因此它将包含v
(如果编译器决定如此),无论循环是否运行。
@Thomas 感谢您的澄清。我想我现在明白了:)。
调用方法时会创建一个框架,所以不,只有在执行while循环时才分配v
的空间。以上是关于while循环中的空间分配的主要内容,如果未能解决你的问题,请参考以下文章