Java类加载以及对象创建过程

对于Java类加载以及对象创建的过程,首先看一下JVM虚拟机运行时内存中的数据分布

分布

  • 私有:
    • 栈内存Stack:栈结果,先进后出,方法进栈执行,执行完毕出栈,方法中的局部变量、操作数栈、动态链接、方法返回值都保存在此处。
    • 本地方法区:加载本地非java语言代码的入口
    • 程序计数器:由于多线程CPU在各线程之间来回切换,因此程序计数器来标记当前线程执行到的代码的位置
  • 共享:
    • 堆内存:存放对象实例,占据内存最大的一块区域,有独特的GC回收机制回收没有引用关联的对象,可分为年轻代和年老代
    • 方法区:存储加载的类信息、常量区、静态变量、JIT(即时编译器)处理后的数据等

类加载及对象创建过程:

  1. 启动JVM,开始分配内存空间
  2. 将编译后的.class文件加载到方法区,非静态内容加载到非静态的区域,静态内容加载到静态区,静态方法调用的时候才会加载
  3. 给静态成员变量默认初始化,默认初始化完成之后开始显示初始化
  4. 执行静态代码块,先执行父类的静态代码块再执行子类的静态代码块
  5. 执行main方法的时候,栈内存开辟空间,压栈–进栈
  6. main方法的栈区分配了一个变量P
  7. 在堆内存中开辟一个对象空间,首先会去方法区查找类是否加载
  8. 类已经加载,开始对象创建,在对象空间对非静态成员变量默认初始化
  9. 加载对应构造函数,执行隐式三步

    1. 隐式的super();
    2. 显示初始化(给所有的非静态的成员变量)
    3. 执行构造代码块
  10. 执行构造函数中的代码