04 Java内存分析

随着工作的深入,越发需要重新梳理一遍Java知识点,本系列是重新学习Java所写。


首先需要明白以下几点:

栈空间(stack),连续的存储空间,遵循后进先出的原则,用于存放局部变量。
堆空间(heap),不连续的空间,用于存放new出的对象,或者说是类的实例。
方法区(method),方法区在堆空间内,用于存放①类的代码信息;②静态变量和方法;③常量池(字符串敞亮等,具有共享机制)。


Java中除了基本数据类型,其他的均是引用类型,包括类、数组等等。
数据类型的默认值


基本数据类型默认值:
数值型:0
浮点型:0.0
布尔型:false
字符型:\u0000
引用类型:null


变量初始化
成员变量可不初始化,系统会自动初始化;
局部变量必须由程序员显式初始化,系统不会自动初始化。


实例进行分析。
创建类
分别是Student、Computer、Test,代码如下:

public class Student {

    int score;
    int age;
    String name;

    Computer computer;

    public void study() {

        System.out.println("studying...");
    }
}
public class Computer {
    int price;
    String brand;
}


 

public class Test {

    public static void main(String[] args) {

        Student stu = new Student();

        stu.name = "xiaoming";

        stu.age = 10;

        stu.study();

        Computer c = new Computer();
        c.brand = "Hasse";

        System.out.println(c.brand);

        stu.computer = c;
        System.out.println(stu.computer.brand);

//        System.out.println("----------------------------------------");
//
//        c.brand = "Dell";
//
//        System.out.println(c.brand);
//        System.out.println(stu.computer.brand);
//
//        System.out.println(stu.computer.brand == c.brand);

    }
}


代码分析
我们知道,程序的入口是main(),因而从main方法从上到下、从左到右进行分析。


Student stu = new Student();
①首先,Java虚拟机(JVM)去方法区寻找是否有Test类的代码信息,如果存在,直接调用。如果没有,通过类加载器(ClassLoader)把.class字节码加载到内存中,并把静态变量和方法、常量池加载(“xiaoming”、“Hasse”)。
②走到Student,以同样的逻辑对Student类进行加载;静态成员;常量池(“studying”)。
③走到stu,stu在main方法内部,因而是局部变量,存放在栈空间中。
④走到new Student,new出的对象(实例),存放在堆空间中,以方法区的类信息为模板创建实例。
⑤‘’=‘’赋值操作,把new Student的地址告诉stu变量,stu通过四字节的地址(十六进制),引用该实例。
如下图:

这里写图片描述

 


stu.name = “xiaoming”;
⑥stu通过引用new Student实例的name属性,该name属性通过地址指向常量池的"xiaoming"敞亮。

stu.age = 10;
⑦s实例的age属性是基本数据类型,基本数据类型直接赋值。

stu.study();
⑧调用实例的方法时,并不会在实例对象中生成一个新的方法,而是通过地址指向方法区中类信息的方法。

⑥⑦⑧的过程如下图:

这里写图片描述

 


Computer c = new Computer();
同stu变量的生成过程。

c.brand = “Hasse”;
同stu.name = "xiaoming"过程。

stu.computer = c;
⑨把c对象对Computer实例的引用赋值给Student实例的computer属性。亦即:该Student实例的computer属性指向该Computer类的实例。
如下图:

这里写图片描述

 

————————————————
版权声明:本文为CSDN博主「刘金宝_Arvin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36743482/article/details/78527312

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值