首页 > 其他 > 详细

关于JVM加载内存图学习小密招

时间:2019-04-24 15:39:39      阅读:135      评论:0      收藏:0      [点我收藏+]

 

先看如下代码:

 

Person.java

 

public class Person {

 

    

 

    private String name;

 

    private int age;

 

 

 

    static int count = 0;

 

    

 

    public Person() {

 

        

 

    }

 

    

 

    public Person(String name, int age) {

 

        this.name = name;

 

        this.age = age;

 

    }

 

    

 

    public void sayHi() {

 

        System.out.println("姓名:"+this.name+",年龄:"+this.age);

 

    }

 

    

 

}

 

   

 

 

 

TestPerson.java

 

public class TestPerson {

 

    public static void main(String[] args) {

 

        Person person = new Person("kallen",20);

 

        person.sayHi();

 

    }

 

}

 

 

 

对象初始化步骤:

 

 

 

1.虚拟机加载TestPerson类(包含准备,链接,初始化),提取类型信息(包含计算申请多大堆空间等),存储到方法区。

 

 

 

2. 通过保持在方法区的字节码(.class) 虚拟机开始执行main方法,main方法入栈(进入方法执行堆栈区)箭头①方法入栈。
技术分享图片

3. 进入main方法的第一条指令new Person("kallen",20);虚拟机看到new 就知道要分配空间了,去方法区找Person类,没找到就装载Person类,并把Person类的类型信息存储到方法区。

通过存储在方法区中Person 类的类型信息确定了实例对象需要分配的空间大小,在堆区分配指定大小的内存,并把实例对象的成员变量初始化为默认值(int初始化为0,引用变量初始为null)。此时,实例对象的内存分配完毕。这是new操作符的第一步。

技术分享图片

new操作的第二步开始执行,调用构造方法,完成对象的初始化工作。然后把对象在堆空间的地址赋值给引用类型变量person。整条Person person = new Person("kallen",20);指令执行完成。
技术分享图片
4. 调用sayHi(),通过person持有的引用,找到堆中的实例对象,通过实例对象持有的本类在方法区的引用,找到本类(Person)的类型信息,然后定位到sayHi方法,sayHi方法入栈,开始执行方法中的字节码。图中箭头④调用方法。
技术分享图片



 

 

关于JVM加载内存图学习小密招

原文:https://www.cnblogs.com/hehy0205/p/10762505.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!