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 个局部变量组成的数组:argsikv

【讨论】:

“框架”是否被视为某种记忆?那么我的第一个陈述是对还是错? “变量v的空间是不是只有在while循环执行时才分配,循环结束时才释放?” @LookAtTheBigPicture 仔细阅读:该框架将驻留在内存中(尽管不是堆),但由于该框架用于整个方法,因此它将包含v(如果编译器决定如此),无论循环是否运行。 @Thomas 感谢您的澄清。我想我现在明白了:)。 调用方法时会创建一个框架,所以不,只有在执行while循环时才分配v的空间。

以上是关于while循环中的空间分配的主要内容,如果未能解决你的问题,请参考以下文章

实验四 主存空间的分配和回收

实验四主存空间的分配和回收

操作系统实验四 主存空间的分配和回收

操作系统实验四 主存空间的分配和回收

操作系统——实验四:主存空间的分配和回收

何时为 C++ 中的类的成员函数分配内存空间?