前言


本篇博客将写一点关于JVM的东西,涉及JVM运行时数据区、类加载的过程、类加载器、ClassLoader、双亲委派机制、自定义类加载器等,这些都是博主自己的一点理解,如果有误,欢迎大家评论拍砖~

关于JVM运行时数据区


JVM运行时数据区

关于类加载


class文件加载至内存,链接(校验、解析),初始化;最终形成JVM可以直接使用的JAVA类型的过程。

加载:在方法区形成类的运行时数据结构;在堆里面形成该类的Class对象,作为访问方法区的入口。

加载

链接:class文件是否存在问题;一些符号引用替换成直接引用。

初始化:初始化一个类,先初始化它的父类。虚拟机会保证一个类的初始化在多线程环境中被正确加锁和同步。

要使用类A,必须先加载类A;加载类A,就会把静态变量、静态块合并初始化,然后在调用构造器。注意类的加载和初始化,只有一次。

关于类加载器


上文已经说了,类加载器的作用就是:将class文件的字节码内容加载到内存中,并将这些静态数据转化成方法区中的运行时数据结构,在堆中生成一个代表这个类的Class对象,作为方法区类数据的访问入口。

类加载器的层次结构

引导类加载器bootstrap classloader

加载JAVA核心库($JAVA_HOME/jre/lib/rt.jar),原生代码实现(C++),并不继承自java.lang.ClassLoader。

扩展类加载器extensions classloader

JAVA可以提供一个扩展目录($JAVA_HOME/jre/ext/*.jar)来加载Java类。

由sun.misc.Launcher.ExtClassLoader实现

应用程序类加载器application classloader(也称系统类加载器)

一般来说,JAVA应用的类由它加载,即加载路径是classpath下的路径。

由sun.misc.Launcher.AppClassLoader实现。

自定义类加载器

开发人员继承java.lang.ClassLoader实现自己的类加载器

类加载器的层次结构

关于java.lang.ClassLoader


ClassLoader的基本职责就是:

第一,根据指定的类名称,找到或者生成对应的字节码,并根据字节码生成class对象

第二,加载JAVA应用所需的资源,如配置文件等。

ClassLoader的组合模式

组合模式为双亲委派机制提供支持

demo:

类加载器的层次

引导类加载器是原生代码实现,我们获取不到,所以是null。

ClassLoader重要API

getParent():该类加载器的父类加载器

loadClass(String name):加载名称为name的类,并返回Class实例。

加载顺序是:先交给扩展类加载器加载,如果加载不到,交给引导类加载器加载,加载不到,交给自己去加载,如果自己也加载不到,那么ClassNotFoundException。【双亲委派机制】 如果要改变类的加载顺序,那么可以override该方法。

findClass(String name),不是加载,仅仅是查找而已

findLoadedClass(String name),查找已经被加载过

defineClass(String name,byte[] b, int off ,int len),可以把字节数组的内容转换成JAVA类,并会返回Class实例。

类加载器的代理模式:双亲委派机制


类加载器的代理模式:就是把加载指定类的过程交给其他加载器。

JAVA默认使用的类加载器代理模式是:双亲委派机制。

双亲委派机制:

就是某个特定的类加载器接到加载类的请求时,首先将加载任务委托给父类加载器,依次追溯,比如说从应用加载器委托给扩展类加载器,从扩展类加载器委托给引导类加载器。这种委托,直至委托到层次最高的类加载器,即引导类加载器,如果委托的父类加载器可以完成加载任务,那么成功返回;只有父类加载器无法完成时,才去自己加载。

可以看出双亲委派机制的意思就是优先父类加载器加载!

试想如果我们定义了一个java.lang.String类,根据双亲委派机制,那么JDK只会加载它自己的String。这显然保证了Java核心库的类型安全。

双亲委派机制不是唯一的选择

虽然JDK默认的类加载机制是双亲委派机制,但是并不是所有都采用,比如有些服务器,如Tomcat,虽然也采用代理的方式加载,但是加载顺序却恰恰和双亲委派机制相反,它是首先尝试加载这个类,只有加载不到的情况下,才去让父类加载器代理加载。

为什么会这样呢,不是说双亲委派很安全么?

其实就是在安全,和灵活方面进行取舍!

写一个自定义类加载器


MyClassLoader:

自定义类加载器

重写findClass:

findClass

Test:

测试

一般情况下,自定义类加载器,需要继承自ClassLoader。

首先来说,可以检查请求的类是否已经被自定义的类加载器加载;如果加载了,那么直接返回;否则,先交给父类加载器,就是进行双亲委派;如果双亲委派也加载不到,再交给自定义类加载器进行“自定义的方式”来加载类。

另外,被2个不同的类加载器加载的同一个类,JVM不会认为是一个类。

好了,关于JVM运行和类加载的过程就写到这里,^_^

作者:张丰哲
链接:https://www.jianshu.com/p/d856ee954f9c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

【随笔】JVM核心:JVM运行和类加载相关推荐

  1. JVM核心——JVM运行和类加载全过程

    1.类加载全过程 (1)类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成JVM可以直接使用的Java类型的过程. 加载 将class文件字节码内容加载到内存中,并 ...

  2. 第六篇 JVM核心机制之JVM运行和类加载全过程(一)

    JVM核心之JVM运行和类加载全过程 为什么研究类加载全过程? 有助于连接JVM运行过程 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM把class文件加载到内存 ...

  3. jvm运行时类加载机制_JVM体系结构:JVM类加载器和运行时数据区

    jvm运行时类加载机制 各位读者好! 在JVM系列的上一篇文章中,开发人员了解了Java虚拟机(JVM)及其体系结构. 本教程将帮助开发人员正确回答以下主题的问题: ClassLoader子系统 运行 ...

  4. jdk包含java语言核心的类_1.1 jvm核心类加载器--jdk源码剖析

    目录 前提: 运行环境 1. 类加载的过程 1.1 类加载器初始化的过程 1.2 类加载的过程 1.3 类的懒加载 2. jvm核心类加载器 3. 双亲委派机制 4. 自定义类加载器 5. tomca ...

  5. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

  6. jvm性能调优 - 01类加载机制Review

    文章目录 困惑 代码是如何运行起来的(粗流程) 编译 类装载子系统 字节码执行引擎 类装载子系统 JVM在什么情况下会加载一个类 验证.准备和初始化的过程 验证阶段 准备阶段 解析阶段 核心阶段:初始 ...

  7. 周末请看:2万字!JVM核心知识总结,赠送18连环炮

    关注"Java后端技术全栈" 回复"000"获取大量电子书 作为java开发人员,JVM是必备的,今天,我把JVM的核心知识点进行了一个总结,画了一张思维导图. ...

  8. JVM核心知识体系(转http://www.cnblogs.com/wxdlut/p/10670871.html)

    1.问题 1.如何理解类文件结构布局? 2.如何应用类加载器的工作原理进行将应用辗转腾挪? 3.热部署与热替换有何区别,如何隔离类冲突? 4.JVM如何管理内存,有何内存淘汰机制? 5.JVM执行引擎 ...

  9. 什么是JVM?JVM概述——初识JVM(类加载器,垃圾回收器,执行引擎)

    此篇文章属于作者初识之后的概述总结,谈论的层面很浅,大佬勿喷. 目录 类加载器 内存管理器(垃圾回收器) 执行引擎 JVM全称是Java Virtual Machine,意为java虚拟机,所以要了解 ...

最新文章

  1. 某大龄程序员哀叹:夫妻双失业后还不起房贷,被迫断供!四年还了80万,60多万都是利息!...
  2. 初探Django2.1:Win10+Python3.6.6环境下安装Django
  3. 结果方程模型(SEM)的理论和基本实现过程
  4. [置顶] 程序员的奋斗史(十五)——谈性格
  5. 基于FT5x06嵌入式Linux电容触摸屏驱动
  6. .net随笔-vb.net 系统计时器
  7. 游戏界著名设计师 Cory Schmtiz:“灵感乍现”是设计生涯里的浪漫
  8. Spring Security 3 Ajax登录–访问受保护的资源
  9. linux下下安装jdk-6u45-linux-x64.bin
  10. 北亚利桑那大学等推出:航拍森林火情检测数据集 FLAME
  11. MySQL常用存储引擎
  12. 使用PHP开发你必须得注意的要点
  13. linux能上ps吗,在linux上使用ps(转载)
  14. Linux内核对per-cpu变量的实现
  15. Asp.net自定义控件开发任我行(附1)-属性一览众山小
  16. RoboMaster电机驱动
  17. com组件 的劫持_2345.com/365j.com的IE首页劫持手动修复方法+修复工具
  18. 计算机共享地址怎么设置到桌面,局域网共享在哪里设置
  19. 【语音处理】时域信号分析基本工具,什么是窗函数
  20. 28-地理空间数据云下载

热门文章

  1. Docker技术笔记:Docker入门浅尝
  2. ES6入门概览二--数组
  3. android端 socket长连接 架构
  4. ORACLE 数据迁移
  5. HDMI_VGA_CBVS同时显示
  6. C++三角函数用法错误error C2668: 'tan' : ambiguous call to overloaded function原因及解决方法
  7. 插值,拟合,逼近的区别理解
  8. C++后台服务程序开发模式
  9. Python—UnicodeEncodeError: 'ascii' codec can't encode/decode characters
  10. Android App开发——添加APP启动界面