当new一个对象时在JVM中会有哪些操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_37315869/article/details/82917128

目录

首先我们了解一下虚拟机(JVM)的内存分布

类加载机制

1、加载

2、连接 

3、初始化


首先我们了解一下虚拟机(JVM)的内存分布

     程序计数器(program count register):当前线程所执行的字节码的行号指示器(每个线程一个计数器,互不影响)

     本地方法栈是jvm调用操作系统方法所使用的栈。

     虚拟机栈是存储局部变量表、操作栈、动态链接、方法出口等信息

     方法区存放了一些常量、静态变量、类信息等,可以理解成class文件在内存中的存放位置。

     虚拟机堆是存储对象和数组,所有线程共享的一块内存区域

类加载机制

JVM把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成JVM可以直接使用的java类型的全过程。

1、加载

class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与

存在继承时:
原则:先静后非,先父后子,先块后器
执行顺序如下:
第一步:父类静态成员变量(方法区)
第二步:父类静态代码块(多个按照顺序执行)
注意:根据静态代码块和变量位置顺序初始化变量
第三步:子类静态成员变量(方法区)
第四步:子类静态代码块

2、连接 

  • 验证:确保Class文件中字节流包含的信息是否符合虚拟机的要求,保证不会危害虚拟机自身的安全
  • 准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配
  • 解析:虚拟机将常量池中的符号引用替换为直接引用的过程

 方法区:

  1. 常量池(Constant Pool):常量池数据编译期被确定,是Class文件中的一部分。存储了类、方法、接口等中的常量,当然也包括字符串常量。

  2. 字符串池/字符串常量池(String Pool/String Constant Pool):是常量池中的一部分,存储编译期类中产生的字符串类型数据。

  3. 运行时常量池(Runtime Constant Pool):方法区的一部分,所有线程共享。虚拟机加载Class后把常量池中的数据放入到运行时常量池。

3、初始化

  1. 当使用new创建一个对象时,jvm会在堆中分配一个内存存放该对象
  2. 父类成员变量和子类成员变量堆内存创建一片内存,指向值为null,先父类成员变量显式初始化(如果有的话)
  3. 父类代码块(父类成员变量初始化
  4. 父类构造器
  5. 子类成员变量显式初始化(如果有的话)
  6. 子类代码块(子类成员变量初始化
  7. 子类构造器 

猜你喜欢

转载自blog.csdn.net/github_37315869/article/details/82917128
今日推荐