• JVM内存模型:类加载过程


     类加载子系统负责加载Class文件,class文件在开头有特定的文件标识。

     ClassLoader只负责class文件的加载,至于是否可以运行,由Execution Engine决定。

    加载的类信息存放在方法区。

    ClassLoader的角色

    相当于一个快递员的角色,把class文件加载到JVM方法区中。

    类的加载过程:

     加载:

    1、通过类的全限定名获取定义此类的二进制字节流

    2、将这个字节流代表的静态存储结构转化为方法区运行时数据结构

    3、在内存中生成一个代表这个类的Class对象,作为方法区各种数据访问入口

     链接:

    验证:

    目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确。

    主要包括四种验证:文件格式验证,元数据验证,字节码验证,符号引用验证。

    准备:

    *为类变量(static)分配内存并且设置该类变量的默认初始值,即零值。

    *准备阶段不包含用final修饰的static,因为final在编译的时候就会分配了,准备阶段会显式初始化。

    *准备阶段不会为实例变量分配初始化,类变量会分配在方法区中,实例变量随着对象一起分配到了java堆中。

    解析:

    *将常量池内的符号引用转换为直接引用的过程。

    *解析操作往往会伴随着JVM在执行玩初始化之后再执行。

    *符号引用就是一组符号来描述引用的目标。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

    *解析动作主要针对类或接口,字段,类方法,接口方法,方法类型等。

    *对应常量池中的constant_Class_info,constant_Fieldref_info,constant_Methodref_info等。

    初始化:

    *初始化阶段就是执行类构造器方法()的过程。此方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。

    *构造器方法中指令按语句在源文件中出现的顺序执行。

    *()不同与类的构造器。

    *若类具有父类,JVM会保证子类的()执行前,父类的()已经执行完毕。

    *虚拟机必须保证一个类的()方法在多线程下被同步加锁。

     

  • 相关阅读:
    SpringBoot 学习(六)Shiro
    【前端设计模式】之享元模式
    C++——多态
    新技术:WEB组态能页面嵌套、属性继承吗?
    babel6使用ES2020最新js语法
    初入算法(1)—— 进入算法世界
    微信小程序使用Animate.css动画库
    【JavaEE】网络编程
    【Redis】集合对象和有序集合对象
    Get请求 与 Post请求的区别
  • 原文地址:https://blog.csdn.net/m0_52043808/article/details/125905068