java程序执行的内存分析过程

本文介绍了Java虚拟机内存模型的简化版本,主要分为虚拟机栈、堆和方法区。虚拟机栈存储方法执行的内存模型,每个方法调用对应一个栈帧。堆用于存储对象和数组,方法区则存储类和常量信息。通过实例代码分析了对象创建、成员变量赋值及方法调用的过程,展示了内存中数据的分配和使用。
摘要由CSDN通过智能技术生成

将JAVA 虚拟机内存模型进行简化,可以简单的分为三个区域:虚拟机栈 stack、堆 heap、 方法区 method area。
虚拟机栈(简称:栈)的特点如下:

  1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
  2. 栈的存储特性是“先进后出,后进先出”

堆的特点如下:
堆用于存储创建好的对象和数组(数组也是对象)

方法区(又叫静态区,也是堆)特点如下:
方法区实际也是堆,只是用于存储类、常量相关的信息!

public class Person {
    String name;
    int age;
    public void show(){
        System.out.println("姓名:"+name+",年龄:"+age);
    }
}
public class TestPerson {
    public static void main(String[ ] args) { // 创建p1对象
        Person p1 = new Person();
        p1.age = 24;
        p1.name = "张三";
        p1.show();
        // 创建p2对象
        Person p2 = new Person();
        p2.age = 35;
        p2.name = "李四";
        p2.show();
    }
}

分析:

从main方法开始执行,首先在虚拟机栈中建立一个main方法的栈帧,args为null;然后创建了一个新的对象p1,p1的初始值为null,于是需要在堆中为p1开辟一块新的地址空间,假设地址为0x11,p1的值即为0x11, name初始值为null,age初始值为0,show方法是一个公有的东西,所以应该将show方法的信息放在存放在方法区里的Person类里面,同时new Person( )调用了Person类的构造方法,故应在虚拟机栈中为构造方法也创建一个栈帧。Person p1 = new Person();运行结束后,构造方法的帧栈出栈。至此,Person p1 = new Person();的内存分析就算完成了。


继续往下执行,age的值为24,由于字符串不是基本数据类型,所以"张三"这个字符串应该放在Person类的常量池里,show方法的信息也存放在Person类里。p1.show( ),show方法被调用,所以应在虚拟机栈中创建一个帧栈(构造方法的帧栈已经出栈),this指当前对象p1,故地址为0x11.。p1.show( )运行结束后,其帧栈出栈。

同上过程

程序运行结束,所有东西都被清空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值