一、类的加载器

1、类的加载

   当你的程序中要用到某个类时,如果这个类还未被加载到内存中,系统就会通过加载,链接,初始化三个步骤来实现对这个类的初始化。

   1、 加载: 就是将类的.class文件读进内存中,并为之创建一个Class对象,任何类被使用时系统都会创建一个Class对象。2、 链接验证:验证类是否符合JVM的规范,并和其他的类协调一致,准备:负责给类的静态成员分配内存,并设置默认初始化值,解析:虚拟机将常量池中的符号引用替换为直接引用。3、初始化执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译期自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的,当初始化一个类的时候,会先对其父类进行初始化,虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。

2、类的初始化时机

   (1)创建类的实例化对象;
   (2)使用类的静态变量,或为其静态变量赋值;
   (3)使用类的静态方法;
   (4)使用反射方式来强制创建某个类的 java.lang.Class 对象;
   (5)初始化某个类的子类;

3、类加载器

   类加载器是用来把类加载进内存的,并为之生成对应的Class对象。

    类加载器的组成:1、BootStrap ClassLoader :启动类加载器,使用C++写的,是JVM自带的类加载器,负责Java平台的核心库,用来装载核心类库。该加载器无法直接获取。2、Extension ClassLoader : 扩展类加载器,负责jre/lib/ext目录下的jar包或java.ext.dirs系统变量所指定的路径中的所有类库装入工作室。3、System ClassLoader : 系统类加载器,负责加载用户类路径(ClassPath)上所指定的类库,程序员人员可以直接这个加载器,如果应用程序中没有自定义的类加载器,一般情况下这个就是程序中的默认类加载器。4、自定义类加载器

4、类加载器双亲委派模型


双亲委派模型的工作工程是: 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器,每一层的加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器, 只有当父加载器反馈自己无法完成这个请求的时候 (它的搜索范围中没有找到所需的类) ,子加载器才会尝试自己去加载。
  使用双亲委派模型来组织类加载器之间的关系,有一个显而易见的好处就是 Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如 java.lang.Object ,它存放在 rt.jar 之中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。如果没有使用双亲委派模型,由各个类加载器自己去加载的话,如果用户自己编写了一个名为 java.lang.Object 的类,并放在程序的ClassPath中,那系统中就会出现多个不同的Object类,Java类型体系中最基础的行为也就无法保证,应用程序也就变得混乱。

代码演示:

public class Test {public static void main(String[] args) {//获取Test类的加载器ClassLoader classLoader = Test.class.getClassLoader();System.out.println(classLoader);//获取扩展类加载器ClassLoader parent = classLoader.getParent();System.out.println(parent);//获取启动类加载器,因为是用C++实现的,Java无法调用查看,返回nullClassLoader parent1 = parent.getParent();System.out.println(parent1);}
}

执行结果:

Java虚拟机——虚拟机类的加载机制相关推荐

  1. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  2. Java虚拟机 —— 类的加载机制

    我们知道class文件中存储了类的描述信息和各种细节的数据,在运行Java程序时,虚拟机需要先将类的这些数据加载到内存中,并经过校验.转换.解析和初始化过后,最终形成可以直接使用的Java类型. 类从 ...

  3. 深入理解Java虚拟机:Java类的加载机制

    本篇内容包括:Java 类的加载机制(Jvm 结构组成.Java 类的加载).类的生命周期(加载-验证-准备-解析-初始化-使用-卸载).类加载器 以及 双亲委派模型. 一.Java 类的加载机制 1 ...

  4. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  5. java类验证和装载顺序_Java类的加载机制和双亲委派模型

    Java类的加载机制和双亲委派模型 1类的加载机制 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading).验证(Verification).准备(Prepar ...

  6. JVM-01:类的加载机制

    本文从 纯洁的微笑的博客 转载 原地址:http://www.ityouknow.com/jvm.html 类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...

  7. 一步步手动实现热修复(二)-类的加载机制简要介绍

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本节课程主要分为3块: 1.一步步手动实现热修复(一)-dex文件的生成与加载 2.一步步手动实现热修复(二)-类的加载机制简要介 ...

  8. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

    java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...

  9. 如何使用示例从Java中的类路径加载资源

    Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...

  10. Java内部类以及类的加载顺序(一)

    java内部类以及类的加载顺序(一) Java 类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类.根据定义的方式不同,内部类分为四大类静态内部类,成员内部类,局部内部类,匿 ...

最新文章

  1. Pure 天气(Android),Pure天气(hanjie.app.pureweather) - 8.5.5 - 应用 - 酷安
  2. 【转自聊聊架构公众号】 Redis大key图形化统计及展示
  3. HashMap的遍历方法
  4. 【Android工具】好软件推荐,安卓手机免费好用的SSH客户端——JuiceSSH
  5. Tensorflow利用函数修饰符@tf.custom_gradients自定义函数梯度
  6. 有一些事情你不必要尝试
  7. 设计模式(C++实现)--一句话总结
  8. Mapper.xml映射文件---Mybatis学习笔记(八)
  9. SAP CAP 编程模型简介
  10. 几何画板自定义工具_几何画板最强版 v5.06 中文版(含教程/实例/控件/打包机/工具集)...
  11. 基于centos8搭建zookeeper集群
  12. 开发者如何快速精简容器云镜像?| 技术头条
  13. TensorFlow 官方文档中文版发布啦(持续维护) 1
  14. 洛谷 P1918保龄球
  15. Xcode7 低版本iOS系统上下有黑边的问题
  16. day 3 - 1 数据类型
  17. 项目启动报 myql字符集报错的问题
  18. mp4 box linux,MP4Box
  19. 2021周更06:春节假期开始
  20. Mysql show profile 详解

热门文章

  1. MSCRM4.0商机移除价目表引起的问题
  2. bzoj 1503: [NOI2004]郁闷的出纳员 (splay)
  3. Dijkstra 路径规划 C#
  4. layer关闭当前窗口并刷新父窗口
  5. Spring Boot和Dubbo整合
  6. Windows Server 2012 GUI与Core的切换
  7. PPT设计的数据图表化表现
  8. 最速下降法/steepest descent,牛顿法/newton,共轭方向法/conjugate direction,共轭梯度法/conjugate gradient 及其他
  9. android fresco 存储,Android使用Fresco之下载图片(包括GIF图)
  10. java linux怎么抓tcp包_Linux使用tcpdump抓取网络数据包示例