北京圣思java_深入Java虚拟机视频教程(圣思堂)--学习笔记

这个视频叫深入java虚拟机比较扯,应该叫java类ClassLoader深入讲解视频。复习下ClassLoader是相关知识

1、类的加载、连接和初始化

加载:查找并加载类的二进制数据

连接:

验证:确保被加载的类的正确性

准备:为类的静态变量分配内存,并将其初始化为默认值

解析:把类中的符号引用转换为直接引用

初始化:为类的静态变量赋予正确的初始值

9b382538abf7b6dfe19d11247895756c.png

2、Java程序对类的使用可以分为两种

主动使用

被动使用

所有的java虚拟机实现必须在每个类或接口被java程序首次主动使用时才初始化

3、主动使用的六种情况

创建类的实例

访问某个类或接口的静态变量,或者该类的静态变量赋值

调用类的静态方法

反射:class.forName

初始化一个类的子类

Java虚拟机启动时被标明为启动类的类

除了以上六种情况其他使用java类的方式被看做是对垒的被动使用,都不会导致类的初始化

4、类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区

的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。

类的加载的最终产品是位于堆区中的Class对象

Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

46c3970f1786d5a7ab9133c8590acb9b.png

5、加载.class文件的方式

从本地系统中直接加载

通过网络下载.class文件

从zip,jar等归档文件中加载.class文件

从专有数据库中提取.class文件

将java源文件动态编译成.class

6、有两种类型的类加载器

Java虚拟机自带的加载器

根类加载器(Bootstrap)

扩展类加载器(Extension)

系统类加载器(System)  也叫应用加载器

用户自定义的类加载器

java.lang.ClassLoader的子类

用户可以定制类的加载方式

如果类是由根类加载器加载的话,Class.getClassLoader()会返回null,比如

Class.forName("java.lang.String").getClassLoader()得到的是null

类加载器不需要等到某个类被首次主动使用时再加载它

JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了

.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报错误(LinkageError错误)

如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误

7、类的验证

类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制数据合并到虚拟机中的运行环境中去

类的验证的内容

类文件的结构检查:确保类文件遵从java类文件的固定格式

语义检查:确保类本身符合Java语法规定,比如验证final类型的类没有子类,以及final类型的方法没有被覆盖。

字节码验证:确保字节码流可以被java虚拟机安全地执行,字节码流代表java方法(包括静态方法和实例方法)

它是由被称作操作码的单字节指令组成的序列,每一个操作码后都跟着一个或多个操作数,字节码验证

步骤会校验每个操作码是否合法,是否有合法的操作数

二进制兼容性验证:确保相互引用的类之间协调一致,比如Worker诶的gotoWork方法中调用

Car类的run方法,Java虚拟机在验证Worker类的时候,会检查在方法去内是否存在run方法,

假如不存在,会抛出NoSuchMethodError错误。

8、类的准备阶段

在准备阶段,Java虚拟机为类的静态变量分配内存,并设置默认的初始值

9、类的解析阶段

在解析阶段,Java虚拟机会把类的二进制数据中的符号引用替换为直接引用,例如

Worker类的gotoWork方法中引用了Carl类的run方法,在Work类的二进制数据中

包含了一个对Car类的run方法的符号引用,它由run方法的全名和相关描述符组成,

在解析阶段,java虚拟机会把这个符号引用替换为一个指针,该指针指向Car类的

run方法在方法区内的内存位置,这个指针是直接引用。

10、类的初始化阶段

在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值,

在程序中,静态变量的初始化有两种途径:1、在静态变量的申明处进行初始化,2、在静态代码

块中进行初始化。

11、类的初始化步骤

a、如果类没有被加载和连接,先进行加载和连接

b、类存在直接的父类,并且这个父类没有被初始化,先初始化直接的父类

c、类中存在初始化语句,依次执行初始化语句

编译时常量不会对类进行初始化,非编译时常量会对类进行初始化

12、类的初始化时机

当Java虚拟机初始化一个类时,要求它的所有父类都已经初始化,但是这条规则不适用于接口

在初始化一个类时,并不会先初始化它所实现的接口

在初始化一个接口时,并不会先初始化它的父接口

因此,一个接口并不会因为他的子接口或者实现类的初始化而初始化,只有当程序首次使用

特定接口的静态变量时,才会导致接口的初始化。

只有当程序访问的静态变量或静态方法确实在当前类或接口中定义时,才可以认为对类或接口的主动使用

调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动调用,不会导致类的初始化

13、类加载器

类加载器用来把类加载到Java虚拟机中,类的加载过程采用父亲委托机制,这种机制能更好地

保证Java平台的安全。在委托机制中,除了Java虚拟机自带的根类加载器以外,其余的加载器都

有且只有一个父加载器。

14、java虚拟机自带一下几种加载器

根类加载器(Bootstrap): 该加载器没有父加载器。负责加载虚拟机核心库,如java.lang.*等。

根类加载器从系统属性sun.boot.class.path所指定的目录中加载类库。根类加载器的实现依赖低层操作系统

属于虚拟机实现的一部分,没有继承java.lang.ClassLoader类

扩展类加载器(Extension): 他的父类加载器为根类加载器,从java.ext.dirs系统属性所指定的目录中

加载类库,或从jdk的安装目录的jre/lib/ext子目录下加载类库,如果用户把jar包放入到这个目录下,

也会自动由扩展类加载器加载。扩展类加载器是纯java类,是java.lang.ClassLoader的子类

系统类加载器(System): 也称作应用类加载器,他的父类加载器为扩展类加载器,他从环境变量classpath、或者系统属性java.class.path所指定的目录中加载类,他是用户自定义的类加载器,

系统类加载器是纯java类,也是java.lang.ClassLoader类的子类。

15、自定义类加载器

除了以上虚拟机自带的类加载器以外,用户还可以定制自己的类加载器,java提供了抽象类java.lang.ClassLoader,所有用户自定义的类加载器应该继承自ClassLoader

f80ae40d7eb8df66365a35684634df6e.png

16、父委托机制

父委托机制中,各个加载器按照父子关系形成树形结构,除了根类加载器以外,其余的类加载器有且只有一个父加载器。

若有一个类加载器能够成功加载类,那么这个类加载器被称为定义类加载器,所有能够成功返回class对象引用的类加载器(包括定义类加载器)都被称为初始类加载器

加载器之间的父子关系实际上指的是类加载器对象之间的包装关系,而不是类之间的继承关系。

当生成一个自定义的类加载器实例时,如果没有指定他的父类加载器,那么系统类加载器将称为该类加载器的父加载器。

17、父委托机制的有点

能够提高软件系统的安全性。因为在此加载机制下,用户自定义的类加载器不可能加载应该由父加载器加载的可靠类,从而防止不可靠甚至恶意的代码替代由父加载器加载的可靠代码。

18、命名空间

每个类加载器都有自己的命名空间,命名空间由该类加载器及所有父加载器所加载的类组成

在同一个命名空间中,不会出现类的完整名字相同的两个类;在不同的命名空间中,可能会出现类的名字相同的两个类。

19、运行时包

由同一个类加载器加载的属于相同包的类组成了运行时包,决定两个类是不是属于同一个运行时包,不仅要看他们的包名是否相同,还可以定义类加载器是否相同。只有属于同一运行时包的类才能相互访问包可见的类和类成员。这样的限制能避免用户自定义的类冒充核心类库的类,去访问核心库的包可见成员。

a5a408d616db9492b344da92a72fc9e1.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视频目录 第1节说在前面的话 [免费观看] 00:05:07分钟 | 第2节整个部分要讲的内容说明 [免费观看] 00:06:58分钟 | 第3节环境搭建以及jdk,jre,jvm的关系 [免费观看] 00:20:48分钟 | 第4节jvm初体验-内存溢出问题的分析与解决 [免费观看] 00:17:59分钟 | 第5节jvm再体验-jvm可视化监控工具 [免费观看] 00:21:17分钟 | 第6节杂谈 [免费观看] 00:12:37分钟 | 第7节Java的发展历史00:27:24分钟 | 第8节Java的发展历史续00:02:27分钟 | 第9节Java技术体系00:08:46分钟 | 第10节jdk8的新特性00:07:31分钟 | 第11节lanmbda表达式简介00:07:02分钟 | 第12节Java虚拟机-classic vm00:06:06分钟 | 第13节Java虚拟机-ExactVM00:03:35分钟 | 第14节Java虚拟机-HotSpotVM00:04:23分钟 | 第15节Java虚拟机-kvm00:03:04分钟 | 第16节Java虚拟机-JRockit00:04:12分钟 | 第17节Java虚拟机-j900:04:23分钟 | 第18节Java虚拟机-dalvik00:02:20分钟 | 第19节Java虚拟机-MicrosoftJVM00:03:57分钟 | 第20节Java虚拟机-高性能Java虚拟机00:02:58分钟 | 第21节Java虚拟机-TaobaoVM00:03:06分钟 | 第22节Java内存区域-简介00:07:56分钟 | 第23节Java内存区域-Java虚拟机栈00:12:04分钟 | 第24节Java内存区域-程序计数器00:12:54分钟 | 第25节Java内存区域-本地方法栈00:02:39分钟 | 第26节Java内存区域-堆内存00:05:08分钟 | 第27节Java内存区域-方法区00:06:32分钟 | 第28节Java内存区域-直接内存和运行时常量池00:15:53分钟 | 第29节对象在内存中的布局-对象的创建00:21:19分钟 | 第30节探究对象的结构00:13:47分钟 | 第31节深入理解对象的访问定位00:08:01分钟 | 第32节垃圾回收-概述00:06:20分钟 | 第33节垃圾回收-判断对象是否存活算法-引用计数法详解00:14:08分钟 | 第34节垃圾回收-判断对象是否存活算法-可达性分析法详解00:07:09分钟 | 第35节垃圾回收算法-标记清除算法00:04:36分钟 | 第36节垃圾回收算法-复制算法00:14:35分钟 | 第37节垃圾回收算法-标记整理算法和分代收集算法00:05:24分钟 | 第38节垃圾收集器-serial收集器详解00:09:45分钟 | 第39节垃圾收集器-parnew收集器详解00:04:53分钟 | 第40节垃圾收集器-parallel收集器详解00:11:02分钟 | 第41节垃圾收集器-cms收集器详解00:14:58分钟 | 第42节最牛的垃圾收集器-g1收集器详解00:18:04分钟 | 第43节内存分配-概述00:04:23分钟 | 第44节内存分配-Eden区域00:22:51分钟 | 第45节内存分配-大对象直接进老年代00:06:42分钟 | 第46节内存分配-长期存活的对象进入老年代00:03:40分钟 | 第47节内存分配-空间分配担保00:04:54分钟 | 第48节内存分配-逃逸分析与栈上分配00:10:32分钟 | 第49节虚拟机工具介绍00:10:27分钟 | 第50节虚拟机工具-jps详解00:11:20分钟 | 第51节虚拟机工具-jstat详解00:09:20分钟 | 第52节虚拟机工具-jinfo详解00:05:03分钟 | 第53节虚拟机工具-jmap详解00:08:48分钟 | 第54节虚拟机工具-jhat详解00:08:10分钟 | 第55节虚拟机工具-jstack详解00:10:19分钟 | 第56节可视化虚拟机工具-Jconsole内存监控00:07:09分钟 | 第57节可视化虚拟机工具-Jconsole线程监控00:12:18分钟 | 第58节死锁原理以及可视化虚拟机工具-Jconsole线程死锁监控00:10:38分钟 | 第59节VisualVM使用详解00:08:03分钟 | 第60节性能调优概述00:11:22分钟 | 第61节性能调优-案例100:23:28分钟 | 第62节性能调优-案例200:10:05分钟 | 第63节性能调优-案例300:12:41分钟 | 第64节前半部分内容整体回顾00:15:41分钟 | 第65节Class文件简介和发展历史 [免费观看] 00:11:26分钟 | 第66节Class文件结构概述 [免费观看] 00:16:50分钟 | 第67节Class文件设计理念以及意义 [免费观看] 00:13:41分钟 | 第68节文件结构-魔数 [免费观看] 00:09:49分钟 | 第69节文件结构-常量池 [免费观看] 00:23:44分钟 | 第70节文件结构-访问标志 [免费观看] 00:11:36分钟 | 第71节文件结构-类索引00:11:26分钟 | 第72节文件结构-字段表集合00:13:21分钟 | 第73节文件结构-方法表集合00:10:06分钟 | 第74节文件结构-属性表集合00:18:23分钟 | 第75节字节码指令简介00:09:18分钟 | 第76节字节码与数据类型00:09:34分钟 | 第77节加载指令00:09:33分钟 | 第78节运算指令00:10:24分钟 | 第79节类型转换指令00:13:42分钟 | 第80节对象创建与访问指令00:09:38分钟 | 第81节操作树栈指令00:03:27分钟 | 第82节控制转移指令00:11:58分钟 | 第83节方法调用和返回指令00:06:37分钟 | 第84节异常处理指令00:09:44分钟 | 第85节同步指令00:07:34分钟 | 第86节类加载机制概述00:07:26分钟 | 第87节类加载时机00:13:15分钟 | 第88节类加载的过程-加载00:15:15分钟 | 第89节类加载的过程-验证00:10:24分钟 | 第90节类加载的过程-准备00:05:40分钟 | 第91节类加载的过程-解析00:14:04分钟 | 第92节类加载的过程-初始化00:19:41分钟 | 第93节类加载器00:22:41分钟 | 第94节双亲委派模型00:17:03分钟 | 第95节运行时栈帧结构00:08:46分钟 | 第96节局部变量表00:20:48分钟 | 第97节操作数栈00:08:36分钟 | 第98节动态连接00:02:56分钟 | 第99节方法返回地址和附加信息00:03:24分钟 | 第100节方法调用-解析调用00:09:49分钟 | 第101节方法调用-静态分派调用00:16:21分钟 | 第102节方法调用-动态分派调用00:09:02分钟 | 第103节动态类型语言支持00:09:27分钟 | 第104节字节码执行引擎小结00:03:38分钟 | 第105节总结与回顾00:10:55分钟
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值