Java内存管理之堆和栈

本文详细介绍了Java内存管理中的堆和栈区域。栈主要存储方法调用的局部变量和对象引用,而堆用于存放动态创建的对象。当方法执行完毕,栈空间会被立即释放,但堆中的对象则需等待垃圾回收机制回收。通过示例代码分析了对象实例化和方法调用时内存的分配与释放过程。
摘要由CSDN通过智能技术生成

Java内存管理之堆和栈

我们都知道Java程序是运行在JVM(Java Virtual Machine)上的,我们可以把JVM理解成Java程序和操作系统之间的桥梁,而Java内存分配也都是基于JVM中进行的。
Java程序运行过程会涉及到两大重要的内存区域——堆和栈。

  • JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧,用于存储局部变量表、操作数、动态链接、方法出口信息等。
  • 当某一个方法调用完成后,其对应的栈帧将被清除。
  • 当栈内存储的内容是:
    1. 由基本数据类型声明的局部变量时,在栈中存储的是它们对应的具体数值。
    2. 局部对象的引用(定义在方法体中的引用类型变量),存储的是具体对象在堆中的地址。若对象的引用没有指向具体的空间,则是null。

  • 程序运行过程中动态产生的数据,比如new出来的对象,存放在堆中。
  • 当对象使用结束,并确定已无实例引用指向堆空间时,JVM才会依据相关垃圾回收机制进行资源回收,完成堆内资源释放。也就是说,并不是方法结束,方法内涉及到的堆空间就会立即释放,这也是与栈管理不同的地方。
  • 需要注意的是,创建出来的对象只包含属于各自的成员变量,并不包括成员方法。即同一个类的不同实例拥有各自的成员变量,存储在堆中的不同位置,但是同一个类的不同实例之间共享该类的方法,并不是每创建一个对象就把成员方法复制一次。

程序执行过程示例分析

public class Cat {
    // 成员属性:昵称、年龄
    String name;    // 昵称 String类型默认值为null
    int month;  // 年龄 int类型默认值为0
    
    // 成员方法:跑动
    public void run(double weight) {
        System.out.println("小猫已经" + weight + ",太重了,快去跑步");
    }
}
public class CatTest {
    public static void main(String[] args) {
        // 对象实例化
        Cat one = new Cat();
        double wh = 200;
        one.run(wh);
    }
}

以上两个类位于同一个包下,程序执行流程如下:

  1. JVM自动寻找main方法,执行第一句代码,创建一个Cat类的实例one,在栈中分配一块内存,存放一个指向堆区对象的地址。譬如0x111111。
  2. 创建一个double型的变量wh,由于是基本数据类型,直接在栈中存放double对应的值200。
    在这里插入图片描述
  3. 当调用one对象的run方法,并以wh为参数传入方法时,JVM检测到方法参数weight,作为方法局部变量,也会放入栈中,并将wh的值200复制给weight。
    在这里插入图片描述
  4. 当完成run方法调用后,立即释放局部变量weight所占用的栈空间。
    在这里插入图片描述
  5. main方法运行结束,立即释放栈中one,wh的空间,而堆中对象空间,则会当确定无引用指向该位置后,由垃圾回收机制进行回收,不会立即释放资源。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值