Java程序运行时内存分析

Java程序运行在Java虚拟机中,JVM把他管理的内存分为三个区域:栈Stack、堆Heap、方法区Method Area

栈描述的是方法执行的内存模块,每个方法的调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量),栈属于线程私有、不能实现线程中的共享,连续空间,速度快。

堆用于存储创建好的对象和数组,JVM只有一个堆,被所有线程共享堆是一个不连续的内存空间。分配灵活,速度慢,
new执行完就放进堆。

方法区又叫静态区JVM只有一个方法区,被所有线程共享,方法区实际也是堆,只是用于存储类、常量相关的信息,
用来存放程序中永远不变或唯一的内容(类信息【class对象】、代码、静态变量、字符串常量。

package 内存分析;

public class Person {
    int age;
    String name;
    Person(int age,String name){
        this.age = age;
        this.name = name;
    }
    
    public static void main(String[] args) {
        int i = 20;//一
        String name = "张三";//二
        Person p1 = new Person(i,name);//三
        Person p2 = p1;//四
        Person p3 = new Person(30,"李四");//五
        System.out.println("p1的个人信息:"+p1.age+","+p1.name);//六
        System.out.println("p2的个人信息:"+p2.age+","+p2.name);//七
        System.out.println("p3的个人信息:"+p3.age+","+p3.name);//八
    }
}

第一步:JVM从硬盘中读取Person.class类文件,通过类加载器把类Person转载到内存中,在方法区中存放了Person原型。
第二步:在方法区中找到main方法,在栈中创建一个main方法栈帧,并开始执行main函数
第三步: 执行代码第一行,因为i是main方法中的局部变量,所以存放在main栈帧;执行代码第二行,定义一个String引用name,指向存放在静态区中的字符串常量“张三”;第三行,new一个Person对象,并调用了构造方法Person(int,String)进行初始化,定义一个引用p1,并在p1中存放了该对象的地址。具体的执行过程如下:首先执行=右边的new Person,通过new在堆中申请了一块内存,存放新建的对象数据,包含对象属性及地址,调用构造函数会在栈中创建一个Person栈帧。一个方法的形参是这个方法中的局部变量,所以i和name存放在person栈帧中,代码执行结束后,会撤销Person方法栈帧。表达式new person的值返回一个地址值,并赋值给了p1。第五行类似于第三行。
xin

初学Java,请各位前辈多多指教!文章若有侵权,麻烦马上联系我哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值