堆内存中data的值是否改变?Java栈堆内存存储机制咨询
Java代码中静态变量的内存存储与值变化解析
先看你提供的完整代码:
public class CBV { static int data = 10; public static void main(String []args) { // data is a local variable //int data = 10; System.out.println("Before data: "+data); changeData(data); System.out.println("After data: "+data); } public static void changeData(int data) { // data is changed and its scope is within this method // so the original value is not changed // In java, garbage collection is automatically handled data = data + 500; // so here data is garbage collected } }
核心结论
堆内存中data的值不会改变——甚至更准确地说,你代码里的这个data根本不在堆内存里。下面详细拆解内存存储和值变化逻辑:
1. 各变量的内存分布
- 静态成员变量
static int data = 10:静态变量属于类本身,在类加载时就初始化,存储在方法区(不是堆),整个程序运行期间只有这一份,所有类的实例、静态方法都共享这个值。 changeData方法的参数int data:这是方法的局部变量,当调用changeData(data)时,会把静态变量data的数值(10)复制一份传递给它,这个参数存储在栈内存的changeData方法栈帧里,是完全独立的变量,和方法区的静态data没有关联。- 补充:如果你打开
main方法里注释的int data =10,那这个才是main方法的局部变量,同样存在栈内存里,会覆盖对静态data的访问,但你现在的代码里没打开,所以main里访问的是方法区的静态data。
2. 值变化的完整流程
- 程序启动,
CBV类加载,静态变量data在方法区被初始化为10。 main方法打印Before data: 10,这里读取的是方法区里的静态data值。- 调用
changeData(data):把静态data的10复制给方法参数data(栈里的局部变量)。 - 在
changeData方法里执行data = data + 500:修改的是栈里的局部变量data,它的值变成510,但这个操作和方法区的静态data完全无关。 changeData方法执行完毕,对应的栈帧被销毁,栈里的局部变量data也随之消失(栈内存是方法结束后自动释放,不需要垃圾回收,垃圾回收只针对堆内存里的对象)。main方法再次打印After data: 10,还是读取方法区里的静态data,它的值从未被修改过。
对你注释的修正
- 你注释里写
// data is a local variable是错误的,当前main方法里的data是静态成员变量,不是局部变量(打开注释的int data=10才是局部变量)。 - 注释里
// so here data is garbage collected错误,局部变量存在栈内存,方法结束后栈帧销毁就释放了,不需要垃圾回收,垃圾回收是处理堆内存中的对象。
内容的提问来源于stack exchange,提问作者Koushik Andhavarapu
相关产品推荐
相关产品推荐

