循环内外变量声明的内存占用对比:哪种更节省内存?
两段Java循环代码的内存占用对比分析
先把两段代码补全,方便大家理解:
第一段代码:
for(int i=0; i<99999999; i++){ int k=2*i; }
第二段代码:
int k=0; for(int i=0; i<99999999; i++){ k=2*i; }
直接给结论
- 从纯内存占用角度看,两段代码在JVM未优化前的表现完全一致,不存在第二段优于第一段的情况;
- 你担心的“第一种写法多占用99999998个额外内存单元”是完全错误的,这是对Java局部变量内存分配机制的误解。
为什么会这样?核心在于Java局部变量的内存分配逻辑
Java中方法内的局部变量是存储在栈帧的局部变量表中的,这个表的大小在编译阶段就已经确定,当方法被调用时,JVM会一次性为所有需要的局部变量分配好内存槽位(slot),不会在代码执行过程中动态创建新的内存单元:
- 第一段里的
k虽然是在循环体内部声明,但它只会占用局部变量表中的1个固定槽位。每次循环执行时,只是把2*i的计算结果覆盖到这个槽位里,循环结束后这个槽位的作用域失效,但不会额外消耗内存。 - 第二段里的
k是在循环外声明的,同样也只占用局部变量表中的1个固定槽位,循环过程中只是重复赋值,没有新增内存开销。
两者唯一的区别是k的作用域范围:第一段的k只能在循环体内访问,第二段的k在整个方法内都能访问,但这和内存占用完全无关。
内容的提问来源于stack exchange,提问作者user8194594
相关产品推荐
相关产品推荐

