Java类加载的过程详解

 更新时间:2021年09月06日 08:42:22   作者:丢丢diu丢  
这篇文章主要介绍了深入理解Java 类加载全过程的相关资料,小编觉得写的还不错,需要的朋友可以参考下,希望能够给你带来帮助

Java:类加载过程

在这里插入图片描述

1.加载——3件事

  • 1.通过全类名获取定义此类的二进制字节流(eg:从jar、war中获取);
  • 2.将字节流所代表的静态存储结构转换为方法区的运行时数据结构;
  • 3.在内存中生成一个代表该类的Class对象,作为方法区这些数据的访问入口。

2.连接

加载阶段和连接阶段的部分内容是交叉进行的,加载尚未结束,连接阶段可能就开始运行了。

2.1.验证

在这里插入图片描述

2.2.准备

准备阶段:正式为类变量分配内存并设置类变量初始值的阶段,这些内存在方法区分配。注意:

1.这时候进行内存分配的仅包括类变量(static),而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在 Java 堆中;

2.除了含有final修饰的变量外,其他都赋值0,null,false这种的。

如下例子, value 的值就被复制为 111,而不是0.

public static final int value=111 

2.3.解析

解析阶段是虚拟机将常量池中的符号引用替换为直接引用的过程。

  • 也就是得到类或者字段、方法在内存中的指针或者偏移量。

什么是符号引用?

* 比如org.simple.People类引用了org.simple.Language类;

* 在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language

3.初始化

初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行类构造器 < clinit >() 方法的过程。

对于< clinit >() 方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为 < clinit >() 方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。

对于初始化阶段,虚拟机严格规范了有且只有5中情况下,必须对类进行初始化:

  • 当遇到 new 、 getstatic、putstatic或invokestatic 这4条直接码指令时,比如 new 一个类,读取一个静态字段(未被 final 修饰)、或调用一个类的静态方法时。
  • 使用 java.lang.reflect 包的方法对类进行反射调用时 ,如果类没初始化,需要触发其初始化.
  • 初始化一个类,如果其父类还未初始化,则先触发该父类的初始化。
  • 当虚拟机启动时,用户需要定义一个要执行的主类 (包含 main 方法的那个类),虚拟机会先初始化这个类。
  • 当使用 JDK1.7 的动态动态语言时,如果一个 MethodHandle 实例的最后解析结构为 REF_getStaticREF_putStaticREF_invokeStatic、的方法句柄,并且这个句柄没有初始化,则需要先触发器初始化。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • spring cloud 使用Hystrix 实现断路器进行服务容错保护的方法

    spring cloud 使用Hystrix 实现断路器进行服务容错保护的方法

    本篇文章主要介绍了spring cloud 使用Hystrix 实现断路器进行服务容错保护的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 两种java实现二分查找的方式

    两种java实现二分查找的方式

    这篇文章主要给大家分享的是java实现二分查找的方式,二分查找是一种查询效率非常高的查找算法。又称折半查找。下面文章我们介绍了两种方法,需要的朋友可以参考一下
    2021-09-09
  • 深入解析Java的Struts框架中的控制器DispatchAction

    深入解析Java的Struts框架中的控制器DispatchAction

    这篇文章主要介绍了深入解析Java的Struts框架中的控制器DispatchAction,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • 关于Java8新特性Optional类的详细解读

    关于Java8新特性Optional类的详细解读

    Optional类是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在,原来用 null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常,需要的朋友可以参考下
    2023-05-05
  • Java实现简单客户信息管理系统

    Java实现简单客户信息管理系统

    这篇文章主要为大家详细介绍了Java实现简单客户信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 细数java for循环中的那些坑

    细数java for循环中的那些坑

    这篇文章主要介绍了Java for循环方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • SWT(JFace) 打印功能

    SWT(JFace) 打印功能

    SWT(JFace)体验之打印功能
    2009-06-06
  • SpringBoot和Vue.js实现的前后端分离的用户权限管理系统

    SpringBoot和Vue.js实现的前后端分离的用户权限管理系统

    本文主要介绍了SpringBoot和Vue.js实现的前后端分离的用户权限管理系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • java中struts2实现简单的文件上传与下载

    java中struts2实现简单的文件上传与下载

    这篇文章主要为大家详细介绍了java中struts2实现简单的文件上传与下载的相关资料,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Java实现复杂的进制转换器功能示例

    Java实现复杂的进制转换器功能示例

    这篇文章主要介绍了Java实现复杂的进制转换器功能,结合实例形式分析了java数学运算的相关实现技巧,需要的朋友可以参考下
    2017-01-01

最新评论