乐趣区

图解Java内存分析详解

首先需要明白以下几点:

栈空间(stack),连续的存储空间,遵循后进先出的原则,用于存放局部变量。
堆空间(heap),不连续的空间,用于存放 new 出的对象,或者说是类的实例。
方法区(method),方法区在堆空间内,用于存放①类的代码信息;②静态变量和方法;③常量池(字符串敞亮等,具有共享机制)。
Java 中除了基本数据类型,其他的均是引用类型,包括类、数组等等。
数据类型的默认值
基本数据类型默认值:
数值型:0
浮点型:0.0
布尔型:false
字符型:u0000
引用类型:null
变量初始化
成员变量可不初始化,系统会自动初始化;
局部变量必须由程序员显式初始化,系统不会自动初始化。
实例进行分析
创建类
分别是 Student、Computer、Test,代码如下:
[Java] 纯文本查看 复制代码
?

public class Student {

    int score;
    int age;
    String name;

    Computer computer;

    public void study() {System.out.println("studying...");
    }

}

[Java] 纯文本查看 复制代码
?

public class Computer {

    int price;
    String brand;

}

[Java] 纯文本查看 复制代码
?

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 通过四字节的地址(十六进制),引用该实例。
如下图:

20171114103423173.png (122.7 KB, 下载次数: 0)

20171114103423173.png
20171114103931438.png (132.59 KB, 下载次数: 1)

20171114103931438.png
20171114102224911 (1).png (116.39 KB, 下载次数: 1)

20171114102224911 (1).png

退出移动版