文章目录

  • 前言
    • JVM类加载机制讲解
      • 一、什么是JVM类加载机制?
      • 二、类加载的时机
      • 三、类加载的五个阶段
        • 1、加载:
        • 2、验证:
        • 3、准备:
        • 4、解析:
        • 5、初始化:
      • 四、什么类型的数据不会初始化? ------- 论点
        • 结论:
        • 论证前准备:
        • 论证:
          • 例子1:使用类字段
          • 例子2:通过数组定义来引用类,不会触发此类的初始化
          • 例子3:常量测试,不会触发定义常量所在类的初始化
      • 五、类加载器
        • 1、【类加载器】用处:
        • 2、【类加载器】使用原则:
        • 3、【类加载器】特性:
      • 六、JVM提供了三种类加载器,分别为:
      • 七、双亲委派
      • 八、打破双亲委派例子

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


JVM类加载机制讲解

一、什么是JVM类加载机制?

概述:java JVM 把【描述类的数据】从class文件中加载到内存,并对该数据进行验证,转换解析和初始化,最终形成可以
【被虚拟机直接使用的java类型】,这个过程我们成为【JVM的类加载机制】


二、类加载的时机

【加载】的五个阶段:

加载、验证、准备、解析、初始化

类从【加载】【卸载】的整个生命周期:

加载、验证、准备、解析、初始化、使用、卸载,其中验证、准备、解析可以把他们统称为连接:

即生命整个生命周期:

【加载】 --> 【连接】 -->【初始化】 --> 【使用】 --> 【卸载】


三、类加载的五个阶段

1、加载:

1)通过一个类的全限定定名来获取【定义此类的二进制字节流】:。
2)将这个字节流中所代表的【静态存储结构】:转化为【方法区中的运行时数据结构】:。
3)在内存中生成一个【代表这个类的 java.lang.Class 对象】:,作为方法区这个类的各种数据的入口。

2、验证:

确保 Class 文件的字节流中包含的信息是否符合【当前虚拟机】:的要求,保证这些信息被当做代码运行后,不会对JVM造成自身安全。

3、准备:

在方法区中分配这些变量所使用的内存空间。

4、解析:

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

5、初始化:

执行类中定义的 Java 程序代码。
注::初始化阶段,主要通过类构造器来实现,即初始化阶段是执行类构造器方法的过程:。


四、什么类型的数据不会初始化? ------- 论点

结论:

所有【引用类型】外加【常量】的方式都不会触发初始化,我们称之为【被动引用】。

论证前准备:

什么是引用类型,什么是基础类型:

在Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。
【基础类型】:byte,short,int,long,char,float,double,Boolean
【引用类型】:类类型,接口类型和数组。

论证:

例子1:使用类字段

原因:通过子类引用父类的静态字段,不会导致子类初始化,对于静态字段,只有直接定于这个字段的类才会初始化。

public class SuperClass {static {System.out.println("This is SuperClass !!!");}public static int index = 55555;
}
public class NodeClass extends SuperClass{static {System.out.println("This is NodeClass");}
}

使用:

public static void main(String[] args) {System.out.println(NodeClass.index);
}

效果:父类初始化,子类并没有初始化

例子2:通过数组定义来引用类,不会触发此类的初始化

原因:数组是引用类型

正常初始化:

    public static void main(String[] args) {NodeClass test = new NodeClass();}

效果:正常初始化

用数组初始化:

   public static void main(String[] args) {NodeClass[] superClass = new NodeClass[10];}

效果:通过数组定义引用类,不会触发此类的初始化

例子3:常量测试,不会触发定义常量所在类的初始化

原因:在源码阶段,确实引用常量类ConstClass中的HELLO_WORLD,但实际上在编译阶段通过常量传播优化,
已经将此常量的值"hello world !!!" 直接存在ConstClass类的常量池中,因此ConstClass类对HELLO_WORLD中的引用,
其实都转化成类对自身【常量池】的引用了。

public class ConstClass {static {System.out.println("This is ConseClass");}public static final String HELLO_WORLD  = "hello world !!!";public static String index = "Hello World !!!";
}

类调非常量:

public static void main(String[] args) {System.out.println(ConstClass.index);
}

效果:正常初始化

类调常量:

public static void main(String[] args) {System.out.println(ConstClass.HELLO_WORLD);
}

效果:不会触发定义常量所在类的初始化


五、类加载器

1、【类加载器】用处:

对于任何一个类,都必须由【加载它的类加载器】【类本身】一起共同确认其在java JVM中的【唯一性】

2、【类加载器】使用原则:

类加载器是在双亲委派模型的基础上实现的。

3、【类加载器】特性:

每个类加载器,都拥有一个【独立的类名称空间】,即如果比较两个类是否相等,只有在这两个类在都是由同一个类加载器加载而来的前提下,才有意义。


六、JVM提供了三种类加载器,分别为:

1)启动类加载器(Bootstrap ClassLoader)

负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath 参数指定路径中的,且被
虚拟机认可(按文件名识别,如 rt.jar)的类。

2)扩展类加载器(Extension ClassLoader)

负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类
库。

3)应用程序类加载器(Application ClassLoader):

负责加载用户路径(classpath)上的类库。
JVM 通过双亲委派模型进行类的加载,当然我们也可以通过继承 java.lang.ClassLoader 实现自定义的类加载器。


七、双亲委派

双亲委派模型:

概述:

当一个类收到了类加载器的请求时,他首先不会尝试自己去加载这个类,而是把这个请求委派给【父类加载器】去完成,每一个层次的【类加载器】都是如此,因此所有的加载请求都应该传送到最顶层的【启动类加载器】其中, 只有当【当父类加载器】反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的 Class),【子类加载器】才会尝试自己去加载。
采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载 器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载 器最终得到的都是同样一个 Object 对象。

好处:

1)保证java类型体系中最基础的行为
2)双亲委派模型对于保证java程序的稳定运作极为重要


八、打破双亲委派例子

OSGI实现的模块化部署打破双亲委派模型
即在OSGI环境下,类加载器不在是双亲委派模型推荐的【树状结构】,而是进一步发展为更加复杂的【网状结构】

JVM类加载机制讲解相关推荐

  1. JVM基础系列第7讲:JVM 类加载机制

    当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...

  2. 【Java虚拟机规范】JVM类加载机制

    [Java虚拟机规范]JVM类加载机制 理论知识 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading).验证(Verification).准备(Prep ...

  3. JVM类加载机制(ClassLoader)源码解析

    http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...

  4. 深入理解JVM虚拟机6:深入理解JVM类加载机制

    深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...

  5. jvm类加载机制_面试:对于JVM类加载机制深度解析

    目录: 前文回顾 JVM在什么情况下会加载一个类? 从实用角度出发,来看看验证.准备和初始化的过程 核心阶段:初始化 类加载器和双亲委派机制 1.前文回顾 咱们今天先来回顾一下昨天讲到的JVM整体的一 ...

  6. jvm类加载机制_JVM 类加载机制

    学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑 Java 的类加载机制,这是 Java 的一个很重要的创新点,曾经也是 Java 流行的重要原因之一. Oracle 当初引入这个机制是为 ...

  7. JVM(2)——JVM类加载机制

    一.JVM类加载机制简介 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言里面 ...

  8. jvm类加载机制和类加载器_在JVM之下–类加载器

    jvm类加载机制和类加载器 在许多开发人员中,类加载器是Java语言的底层,并且经常被忽略. 在ZeroTurnaround上 ,我们的开发人员必须生活,呼吸,饮食,喝酒,并且几乎与类加载器保持亲密关 ...

  9. JVM类加载机制详解

    本文来详细说下JVM类加载机制 文章目录 概述 类加载器是什么 类加载的过程 加载 连接 初始化 类的主动引用和被动引用 主动引用 被动引用 三种类加载器 双亲委托机制 核心思想 源码分析 类的动态加 ...

最新文章

  1. mysql 主从复制 position_mysql 主从复制原理及步骤。
  2. 挑战独立开发项目能力___ITlanbao
  3. freemark静态页面中文乱码
  4. shell脚本中用到的条件和循环语句
  5. SAP MM模块-实施顾问岗位-面试手册-项目管理经验面试清单-英文
  6. Edge Deletion CodeForces - 1076D(水最短路)
  7. sass-loader高版本的坑
  8. hmtl--textarea的滚动条(转)
  9. 反编译工具ILSpy下载
  10. 8、Linux下文件服务器搭建及原理讲解
  11. arm触摸屏的头文件_ARM触屏校准程序
  12. 软件工程阶段性总结(四)——测试和维护
  13. Oracle-表空间管理
  14. unturned服务器参数修改,《Unturned》3.X.X控制台指令教程
  15. 2022大作业项目报告
  16. 英雄联盟 无法服务器未响应,Win7英雄联盟登陆服务器未响应的解决方法
  17. 如何禁用 粘滞键(连按5次 shift键)
  18. L2级ADAS前装搭载量1月同比增超6成,国产供应商“崭露头角”
  19. 华为服务器怎么连接显示器,服务器怎么链接显示器
  20. 2022最新盲盒商城完整开源运营源码/对接免签支付接口/搭建教程

热门文章

  1. delphi WinExec CMD调用
  2. C++买糖-开学了,老师想要买棒棒糖分给同学们作为开学礼物。商店里共有两种包装的棒棒糖,每一包里面棒棒糖的数量可能不同,价格也不同。为了公平,老师决定只买一种棒棒糖。商店不允许将棒棒糖的包装拆开
  3. linux mrtg 进程名称,linux 下MRTG的使用
  4. 封面新闻的笔试小项目
  5. 2021青年男女健康调查:健康心虚指数飙升,90后压力感知最高
  6. Linux中chkconfig命令详解
  7. java nfa dfa_NFA 、DFA 简述
  8. debug没问题,release有问题的情况
  9. NewSQL是伪命题还是真突破?NewSQL系统综述
  10. 分时线的9代表什么_一位65岁长沙股神告诉你:为什么要打板?写给那些一年想几十倍的人!...