You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

堆内存中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. 值变化的完整流程

  1. 程序启动,CBV类加载,静态变量data在方法区被初始化为10。
  2. main方法打印Before data: 10,这里读取的是方法区里的静态data值。
  3. 调用changeData(data):把静态data的10复制给方法参数data(栈里的局部变量)。
  4. 在changeData方法里执行data = data + 500:修改的是栈里的局部变量data,它的值变成510,但这个操作和方法区的静态data完全无关。
  5. changeData方法执行完毕,对应的栈帧被销毁,栈里的局部变量data也随之消失(栈内存是方法结束后自动释放,不需要垃圾回收,垃圾回收只针对堆内存里的对象)。
  6. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:12:14