深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制
虚拟机把描述类的Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的。
一、类的生命周期:
类从加载到内存,直至从内存中卸载。整个生命周期如下图:

其中,加载、验证、准备、初始化、和卸载这5个阶段的顺序是确定的。
二、类加载的时机:
Java并没有规定什么时候对类进行加载,但是规定了有且只有5中情况,要对类进行加载:
- new实例化对象时、读取或者设置类的静态字段时,以及调用一个类的静态方法时;
- 使用java.lang.reflect包的方法,对类进行反射调用时;
- 初始化一个类,但是其父类还没有初始化时;
- 虚拟机启动时,要执行的主类;
- 动态语言支持时,java.lang.invoke.MethodHandle实例
三、类加载的时机
1. 加载
加载阶段主要完成3件事:
- 通过一个类的全限定名获取定义此类的二进制字节流(Class文件、zip包、网络、运行时计算)
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 生成一个java.lang.Class对象(未规定该对象的具体存放位置,HotSpot虚拟机将Class对象存放在方法区中),作为方法区这个类的各种数据的访问入口
2. 验证
连接阶段的第一步。
- 文件格式验证 : 字节流是否符合Class文件格式
- 元数据验证 : 类的元数据进行语义验证
- 字节码验证 :
- 符号引用验证 :
3. 准备
连接阶段的第二步。
为类变量分配内存,并设置类变量的初始值(一般为0,final常量会直接赋值)。
4. 解析
连接阶段的第三步。
虚拟机将常量池内的符号引用替换为直接引用的过程。
5. 初始化
对类变量进行初始化,涉及到类变量的初始化顺序。
四、类加载器
“通过一个类的全限定名来获取描述此类的二进制字节流”,实现这个动作的代码块称为“类加载器”。
1. 类与类加载器
对于任意一个类,都由加载它的类加载器和这个类本身一同确立其唯一性。
类与类是否相等:Class对象的equals()方法,isAssignableForm()方法,isInstance()方法,instanceof关键字判定
类加载器的种类:
Java虚拟机角度:启动类加载器(Bootstrap ClassLoader)、所有其他的类加载器;
Java开发人员角度:启动类加载器、扩展类加载器、应用程序类加载器;
2. 双亲委派模型

要求:除了顶层的启动类加载器之外,其余的类加载器都应当有自己的父类加载器。
工作流程:如果一个类加载器收到了类加载的请求,首先把这个请求委派给父类去完成,最终传递给启动类加载器。只有当父类加载器无法完成这个请求时,子加载器才会尝试自己去加载。
3. 破坏双亲委派模型
双亲委派模型经历了3次被“破坏”。
第一次,jdk1.2之前,必须覆盖loadClass()方法,书写不规范导致不符合双亲委派模型。因此jdk1.2之后,覆盖findClass()方法即可。
第二次,父类加载器请求子类去完成类加载。
第三次,代码热替换、模块热部署等会出现在平级的类加载器中进行加载。
深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制的更多相关文章
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- 深入理解Java内存模型中的虚拟机栈
深入理解Java内存模型中的虚拟机栈 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都会有各自的用途,以及创建和销毁的时间,有的区域会随着虚拟机进程的启 ...
- 《Thinking In Java》阅读笔记
<Thinking In Java>阅读笔记 前四章:对象导论. 一切都是对象. 操作符. 控制执行流程 public在一个文件中只能有一个,可以是一个类class或者一个接口interf ...
- Java基础 -- 深入理解Java类型信息(Class对象)与反射机制
一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...
- java中的自动拆装箱与缓存(Java核心技术阅读笔记)
最近在读<深入理解java核心技术>,对于里面比较重要的知识点做一个记录! 众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为 ...
- JVM虚拟机内存溢出垃圾收集及类加载机制总结
1.Java内存区域与内存溢出异常 虚拟机栈:为虚拟机执行Java方法服务 本地方法栈:为虚拟机使用到的native方法服务. Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一 ...
- JVM学习笔记(四):类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 一.类加载的时机1. 类从被加载到虚拟机内存 ...
- Java程序员的必备知识-类加载机制详解
类加载器的概念 类加载器是一个用来加载类文件的类. Java源代码通过javac编译器编译成类文件.然后JVM来执行类文件中的字节码来执行程序.类加载器负责加载文件系统.网络或其他来源的类文件. JV ...
- 深入理解Java 虚拟机阅读笔记(一)
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...
随机推荐
- JAVA基础 XML生成与解析和String包装类下 .replace方法的使用以及char和字符序列的使用场景
ptLink0.setText(arbu.getPtLink().replace("&","&")); // 如果像 '&','& ...
- python之shutil模块详解
shutil模块 -- --High-level file operations 高级的文件操作模块. os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作.比如 ...
- vue 组件间的通信
(1)props:用于父组件向子组件传递消息 使用方法: 在父组件中,使用子组件时,<Child v-bind:data="data"/>,通过v-bind把子组件需要 ...
- (转载)面试题收集——Java基础部分(一)
转自:http://www.cnblogs.com/xdp-gacl/p/3641769.html 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可 ...
- Linux入门基础(五):Linux管道,重定向,文本处理
多命令协作:管道及重定向 在Linux中,大多数命令都很简单,每个命令往往只实现一个或几个很简单功能. 我们可以通过将不同功能的命令组合起来一起使用,达到完成某个复杂功能的目的 CLI下几乎所有的命令 ...
- 基于Redis实现分布式锁(续)
代码实现: redis实现分布式锁(lock:通过间隔时间段去请求Redis,来实现阻塞占用,一直到获取锁,或者超时. unlock:删除redis中key)
- LeetCode 193. Valid Phone Numbers
分析 难度 易 来源 https://leetcode.com/problems/valid-phone-numbers/ 题目 Given a text file file.txt that con ...
- 服务发现与消费 --> Spring Cloud Eureka
在上两篇文章中,我们已经搭建起微服务架构中的核心组件 服务注册 中心(包括单节点模式和高可用模式).同时, 还对上一章中实现的Spring Boot入门程序 做了改造. 通过简单的配置,使该程序注册到 ...
- Docker 自定义网络
1.创建自定义网络 docker network create -d bridge --subnet 172.25.0.0/16 network_name 2.redis docker 添加到网络 d ...
- Docker 入门之docker容器创建
使用docker容器的大多数人都是因为想要隔离不同运行环境的差异,使得自己的应用能更好的移植和部署.那么我们来看看掌握docker需要掌握哪些方面. 1,搭建docker环境 2,编译镜像并将其运行成 ...