笔记:深入理解JVM 第三部分 虚拟机执行子系统 (第6、7、8、9章)

时间:2023-01-03 12:07:26

一、第6章 类文件结构

1、Class类文件结构

结构:二进制流

魔数:0xCAFEBABE

1.7.0的版本号:50.0

内容:常量池、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合、属性表集合、

2、字节码指令

分类:加载和存储指令、运算指令、类型转换指令、对象创建和访问指令、操作数栈管理指令、控制转移指令、方法调用和返回指令、异常处理指令、同步指令


二、第7章 类加载机制

1、初始化时机

(1)、new 一个对象,调用静态字段或方法

(2)、反射

(3)、初始化子类

(4)、JVM启动类

(5)、1.7中的动态语言


不会初始化时机:

(1)、使用编译时常量 (final static 变量)

(2)、使用父类的静态变量或方法,不初始化子类

(3)、创建一个数组:

MyClass[]  clazzes = new  MyClass[10] ;

以上语句不会初始化。

(4)、初始化类不会初始化其实现的接口


2、类加载的过程

加载的例子:

(1)、从JAR、WAR、ZIP 等包读取

(3)、从网络中读取

(4)、动态代理、CGLIB等生成类

(5)、JSP 生成Class类

(6)、数据库中读取


3、类加载器

双亲委派模型:

Bootstrap ClassLoader:加载 /lib 下类

Extension ClassLoader:加载 /lib/ext 下类

Application ClassLoader:加载 classpath下类


破坏双亲委派模型:
(1)、JNDI服务的线程上下文类加载器:通过java.lang.Thread.setContextClassLoader()设置ClassLoader,绕过双亲委派模型。
(2)、热部署:OSGi中的类加载器,不在是双亲委派,而是网状结构。


三、第8章 字节码执行引擎

1、运行时栈帧结构

包括:局部变量表、操作数栈、动态连接、方法返回地址、附加信息


2、方法调用

包括:解析、分派、、动态语言支持


3、基于栈的字节码解释执行引擎


四、第9章 类加载和执行案例

1、Tomcat的类加载器

类库目录划分:

/common :可被Tomcat 和 所有Web应用共同使用

/server :只能被Tomcat 使用,所有Web应用的不可以使用

/shared:Tomcat不可以,所有Web应用都可以使用

/deploy/myApp/Web-INF:Tomcat不可以,myAPP私有,其余web应用不可以

笔记:深入理解JVM 第三部分 虚拟机执行子系统 (第6、7、8、9章)


2、OSGi  (Open Service Gateway Initiative) 灵活的类加载器架构

类加载器不再是双亲委派模型的树形结构,而是复杂的网状结构

优点:(1)、更精确的模块划分和可见性控制。

(2)、模块热插拔,程序升级更新、调试除错,可以只停用程序中的一部分,而非全部。


缺点:

(1)、类加载器的网状结构容易造成死锁

(2)、容易造成内存泄露

 

3、字节码生成技术

动态代理、CGLib、AOP 等

 

4、Retrotranslator

可将新版本的代码回退为老版本。