7.3内存收集器
- serial收集器:单线程,主要用于client模式
- ParNew收集器:多线程版的serial,主要用于server模式
- Parallel Scavenge收集器:线程可控吞吐量(用户代码时间/用户代码时间+垃圾收集时间),自动调节吞吐量,用户新生代内存区
- Serial Old收集器:老年版本serial
- Parallel Old收集器:老年版本Parallel Scavenge
- CMS(Concurrent Mark Sweep)收集器:停顿时间短,并发收集
- G1收集器:分块标记整理,不产生碎片
8.虚拟机指令集架构(执行引擎)
8.1虚拟机字节码执行引擎
运行时栈帧结构
每个方法调用开始到执行完成的过程,对应这一个栈帧在虚拟机栈里面从入栈到出栈的过程。
- 栈帧包含:局部变量表,操作数栈,动态连接,方法返回
- 方法调用
方法调用不等于方法执行,而且确定调用方法的版本。
- 方法调用字节码指令:invokestatic,invokespecial,invokevirtual,invokeinterface
- 静态分派:静态类型,实际类型,编译器重载时通过参数的静态类型来确定方法的版本。(选方法)
- 动态分派:invokevirtual指令把类方法符号引用解析到不同直接引用上,来确定栈顶的实际对象(选对象)
- 单分派:静态多分派,相同指令有多个方法版本。
- 多分派:动态单分派,方法接受者只能确定唯一一个。
基于栈的字节码解释
解释执行:
基于栈指令集与基于寄存器的指令集:
基于本地解释器执行过程
类加载 执行子系统案例
tomcat类加载,OSGI热插拔,字节码生成技术,动态代理,Retrotranslator
9.虚拟机实现机制进化过程
程序编译与代码优化
早期编译(编译期)
- javac编译器:解析与符号表填充,注解处理,生成字节码
- java语法糖:语法糖有助于代码开发,但是编译后就会解开糖衣,还原到基础语法的class二进制文件
重载要求方法具备不同的特征签名(不包括返回值),但是class文件中,只要描述不是完全一致的方法就可以共存,如:
- public String foo(List<String> arg){
- final int var = 0;
- return "";
- }
- public int foo(List<Integer> arg){
- int var = 0;
- return 0;
- }
晚期编译(运行期)
- 解析模式 -Xint
- 编译模式 -Xcomp
- 混合模式 Mixed mode
- 分层编译:解释执行 -> C1(Client Compiler)编译 -> C2编译(Server Compiler)
- 触发条件:基于采样的热点探测,基于计数器的热点探测
10.总结
由于JVM涉及内容较深且广,篇幅有限无法深入分析细节。本文从微观方面分析了作为原材料的CLASS文件的结构,又从宏观方面阐述了JVM是如何消化每一个进入的CLASS。JVM自定义了一套逻辑上的指令集,这也呼应了之前我们介绍的计算机如何运行一文,现代计算机性能有了长足的发展,但是本质上还是完备的诺依曼体系架构。随着量子计算的突飞猛进,相信未来的计算模型也会有革命性的突破。 【编辑推荐】 - 如何合理的规划JVM性能调优
- 深入进阶:图解分析JVM内存堆布局
- Java虚拟机如何加载类的?
- 核心基础:理解何为JVM?掌握Java虚拟机构成精髓
- JVM 理解其实并不难!
【责任编辑:武晓燕 TEL:(010)68476606】
点赞 0 (编辑:好传媒网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|