在理解ClassLoader之前,我们先回顾下Java的一些相关知识。

基础

1. Java的主要特性

  • 平台无关性
  • 面向对象
  • GC(Java的垃圾回收机制)
  • 类库
  • 语言特性
  • 异常处理

2. 为什么JVM直接将 源码解析成机器码去执行

  • 准备工作:每次执行都需要各种检查
  • 兼容性:也可以将别的语言解析成字节码

Compile Once,Run Anywhere如何实现

​ java源码首先被编译成字节码,再由不同平台的JVM进行解析,Java语言在不同的平台上运行时不需要进行重新编译,Java虚拟机在执行字节码的时候,把字节码 转换成具体平台上的机器指令。

3. JVM如何加载.class文件

  • Class Loader:依据特定格式,加载class文件到内存
  • Execution Engine:对命令 进行 解析
  • Native Interface:融合不同开发语言的原生库为 Java所用
  • Runtime Data Area:JVM内存空间结构模型

4. 反射

​ Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意 一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java语言的反射机制。

5. 类从编译到执行的过程

  • 编译器将Xxx.java源文件编译为Xxx.class字节码文件
  • ClassLoader 将字节码转换为JVM中的Class<Xxx>对象
  • JVM利用Class<Xxx>对象实例化为Xxx对象

谈谈ClassLoader

​ ClassLoader 在 Java 中有着非常重要的作用,它主要工作在 Class 装载的加载阶段,其主要作用是从系统外部获得 Class 二进制数据流。它是 Java 的核心组件,所有的 Class 都是由 ClassLoader 进行加载的,ClassLoader 负责通过将 Class 文件里的二进制数据流装载进系统,然后交给 Java 虚拟机进行连接、初始化等操作。

1. ClassLoader的种类

  • BootStrapClassLoader:C++ 编写,加载核心库 java.*
  • ExcClassLoader:Java 编写,加载扩展库 javax.*
  • AppClassLoader:Java 编写,加载程序所在目录
  • 自定义 ClassLoader:Java 编写,定制化加载

2. 自定义 ClassLoader 的实现

关键函数

protected Class<?> findClass(String name) throws ClassNotFoundException {throw  new ClassNotFoundException(name);
}protected final Class<?> defineClass(byte[] b, int off, int len) throws ClassFormatError {return defineClass(null, b, off, len, null);
}

3. 类的加载方式

  • 隐式加载:new
  • 显示加载:loadClass,forName等

4. loadClass和forName的区别

类的装载过程

5. loadClass和forName的区别

  • Class.forName得到的class是已经初始化完成的
  • Classloader.loadClass得到的class是还没有链接的

6. 谈谈类加载器的双亲委派机制

不同类的加载方式和加载路径不同,为了实现分工,各自实现各自的功能,使得逻辑更加的明确,才有这么多共存的ClassLoader,加载类会根据各自的区域各司其职,而双亲委派机制会使这些加载器相互协调,形成一个整体。

双亲委派机制的原理图

loadClass源码解析

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{synchronized (getClassLoadingLock(name)) {// 首先,检测该类是否已被加载Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {// 检查上层是否已被加载if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);    }} catch (ClassNotFoundException e) {// 如果未发现类,则抛出异常}if (c == null) {// 如果仍未找到,则委托findClass方法去寻找long t1 = System.nanoTime();// 自定义的findClass方法c = findClass(name);sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}
}

为什么要使用双亲委派机制去加载类?

为了避免多份同样字节码的加载。(通过逐层检查可以避免多份由各自加载的相同 class文件 )

浅析Java内存模型--ClassLoader相关推荐

  1. java内存模型浅析_浅析java内存模型

    原标题:浅析java内存模型 Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的.Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型--又称为Java内存模型 ...

  2. 浅析Java内存模型

    概述 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量是线程共享的,存在竞争问题的. Java内存模型规定了所有的变量 ...

  3. JVM(一)JVM虚拟机内存结构 和 JAVA内存模型(JMM)

    本文转自:浅析java内存模型--JMM(Java Memory Model) - 路易小七 - 博客园,尊重作者,转载请注明出处~ JVM虚拟机内存结构 和 JAVA内存模型 是两个不同的概念 JV ...

  4. java内存模型浅析_浅谈java内存模型

    不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的.其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改.总结jav ...

  5. 浅析java内存管理机制

    内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和java语言内存管理机制的不同的基础上,浅析java中 ...

  6. JAVA内存模型及垃圾回收自我总结

    本文为原创,根据<深入理解java虚拟机>和自己的一些理解进行整理,单纯和看其他人的博客感觉不如自己一点点的画和记录来的印象深刻. JAVA内存模型: 上图中:局部变量表所需的内存在编译期 ...

  7. 再有人问你Java内存模型是什么,就把这篇文章发给他。

    前几天,发了一篇文章,介绍了一下JVM内存结构.Java内存模型以及Java对象模型之间的区别.有很多小伙伴反馈希望可以深入的讲解下每个知识点.Java内存模型,是这三个知识点当中最晦涩难懂的一个,而 ...

  8. java虚拟机jvm与Java内存模型(JMM)

    Java内存模型(JMM) Java 内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存.Java 内存模型(JMM) 抽象了线程和主内存之间的关系,就比如说线程之间的共享变量必须存 ...

  9. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

最新文章

  1. github 地图上画区域的工程_筑工程测量区别
  2. eclipse @ 注释为何一写就报错
  3. 如何简单的在 ASP.NET Core 中集成 JWT 认证?
  4. 值类型和引用类型及其区别!
  5. Redis学习总结(23)——Redis集群化方案对比:Codis、Twemproxy、Redis Cluster
  6. java中输出拼json,java poi 解析excel 输出json 并且拼接字符串显示到jsp
  7. chrome onetab_我的 Chrome 高效拓展推荐
  8. 12.UNIX 环境高级编程--线程控制
  9. Differential Privacy差分隐私
  10. 我的linux学习之路---配置VNC服务器(1)
  11. 拖放 Drag and drop
  12. 网易乐得数据库及运维分享会
  13. 月薪4万是一种什么样的感受?
  14. 数据类型 varbinary 和 varchar 在 add 运算符中不兼容。
  15. 使用Git来管理svn代码
  16. Apache dbutils工具
  17. 学习笔记 - 预祝CSDN 1024程序猿节日圆满成功
  18. 一些代码和心得记录我的成长经历
  19. mybatis多对一映射association详解
  20. fx3g485通讯模块_三菱fx3u利用fx3u-m485bd通讯模块与modbus设备通讯

热门文章

  1. 大数据技术:分布式系统和分布式事务
  2. 是什么调性_协调性训练 | 单脚跳
  3. oracle 视图使用rownum,Oracle数据对象--视图
  4. centos losf 安装_Linux Centos7部署环境安装-CentOS
  5. windows 10 安装和使用中5个常见问题
  6. 非递归遍历N-ary树Java实现
  7. 设计模式:享元(FlyWeight)模式
  8. 从输入url到显示网页,后台发生了什么?
  9. HDU 2094 产生冠军 (map容器)
  10. mof格式的文件怎么打开?用什么工具?