Java内存分析详情

Java的虚拟机内存分为三个区域:栈stack、堆heap、方法区method area

栈的特点:

  1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
  2. JVM会为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
  3. 栈属于线程私有,不能实现线程间的共享
  4. 栈的存储特性是“先进后出,后进先出”
  5. 栈是由系统自动分配,速度快。
  6. 栈是一个连续的内存空间。

堆的特点:

  1. 堆用于存储创建好的对象和数组(数组也是对象)
  2. JVM只是一个堆,被所有线程共享
  3. 堆是一个不连续的内存空间,分配灵活,速度慢

方法区(又叫静态区)特点:

  1. JVM只有一个方法区,被所有线程共享
  2. 方法区实际也是堆,只是用于存储类、常量相关的信息
  3. 用来存放程序中永远是不变或唯一的内容(类信息[Class对象]、静态变量、字符串常量等)
public class HKStu {
    int id;
    String sname;
    int age;
    Computer comp;

    void study(){
        System.out.println("使用电脑学习"+comp.brand);
    }

    void play(){
        System.out.println("我在玩游戏");
    }

    HKStu(){
        //构造方法。用于创建这个类的对象。无参的构造方法可以由系统自动创建。
    }

    public static void main(String[] args) {
        HKStu student = new HKStu();
        student.id = 7036;
        student.sname = "Java";
        student.age = 25;

        Computer compt = new Computer();
        compt.brand = "MacBook";
        
        student.comp = compt;

        student.study();
        student.play();
    }
}
class Computer{
    String brand;
}

以上述代码为例,编译后,首先从PSVM开始,程序分配栈、堆和方法区。

  1. 代码加载到方法区中,类的相关信息:代码、静态变量、静态方法、字符串常量(“使用电脑学习”、“我在玩游戏”、“Java”、“MacBook”)
  2. 进入main方法后,在栈中开辟main方法的空间。创建student对象,使用new方法,栈内再开辟构造方法的空间,在堆中创建对象,包括对象的属性和方法。创建完毕后,构造方法释放。
  3. 设置属性根据数据类型寻找赋值,如数字常量直接赋值,字符串常量去方法区中存储的字符串常量中寻找赋值
  4. 若中间插有其他类的属性(如Computer),创建Computer对象,在栈中为Computer的构造方法分配内存空间,在栈中创建comp对象及属性、方法,创建完后栈中构造方法的内存释放。
  5. student根据comp的地址寻找自己需要的属性,然后赋值
  6. 调用方法同理
  7. 全部执行完后,全部释放内存,虚拟机关闭。

如下图所示
内存运行机制示意图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值