上一章讲到了类的加载机制,主要有传统派的 双亲委派模型 和 现代主义激进派的 osgi 类加载器。接下来继续。
第8章 虚拟机字节码执行引擎
局部变量表,用于存储方法参数和方法内部定义的局部变量。
操作数栈,其实书上解释的糊里糊涂的,个人理解一下,主要是因为cpu寄存器太少,而又要进行各种子方法的调用,那么为了保存外部的一些寄存器值,所以使用了操作数栈。进入子方法的时候,先入栈保存起来,退出时再一个个弹出栈回原来的寄存器。
动态连接,在每一次运行期间转化为直接引用的操作。
基于栈的字节码解释执行。
java中提供了5个方法调用字节码指令,invokestatic 调用静态方法。invokespecial 调用实例构造器<init>方法、私有方法和父类方法 ,invokevirtual 调用所有的虚方法,invokeinterface 调用接口方法,在运行时再确定一个实现此接口的对象,这给我们面向接口编程提供了能力。invokedynamic 先在运行时动态解析出调用点限定符所引用的方法,再执行该方法。javap -c a 可查看字节码。
虚拟机动态分派的实现为,在类的方法区中建立一个虚方法表vtable,使用虚方法表索引来代替元数据查找从而提高性能。
tomcat 类加载器
osgi 类加载器
字节码生成技术和动态代理的实现。
可以使用 retrotranslator 将高版本里写的代码,编译回低版本的运行环境中,原理就是写一些高版本里自代的方法替换到低版本中。
第10章 编译期优化
javac 源码与调试,javac编译器是用java语言实现的,可以直接阅读其源码。
java 语法糖,语法糖就是,表面看起来牛b,实际并没什么卵用的东西。其实主要是为了提高开发效率,以及减少犯错的机会的辅助性语法。如 泛型、自动拆装箱。。。
第11章 运行期优化
运行期的热点代码,将会被编译成平台相关的机器码,从而提高性能。
热点代码分,被多次调用的方法、被多次执行的循环体。
方法计数器触发即时编译;
回边计数器触发即时编译
client compiler 架构
使用 +XX printcompilation可以将编译的方法打印出来。printinlining。-XX : +printcompilation 。
第12章 java内存模型与线程
处理器、高速缓存、主内存间的交互关系
处理器可能会对输入代码进行乱序执行优化。而java虚拟机的即时编译也可能进行指令重排序优化。
java主内存与工作内存的交互关系
java主内存与工作内存的交互协议,定义了8个操作,每一个都是原子性的。
lock 锁定
unlock 解锁
read 读取,和load 连贯操作
load 载入
use 使用
assign 赋值
store 存储,和write 连贯操作
线程的实现,使用内核线程实现,使用用户线程实现,混合实现
使用内核线程
使用用户线程
混合实现
java线程有10优先级, Thread.MIN_PRIORITY, Thread.MAX_PRIORITY,针对windows的7个优先级,做重叠处理。
java线程状态转换
第13章 线程安全与锁优化
不可变的对象一定是线程安全的。
synchronized ,reentrantlock,threadlocalmap。
锁优化,适应性自旋锁 adaptive spinning,锁消除 lock elimination,锁粗化 lock coarsening,轻量级锁 lightweight locking,偏向锁 biased locking。
额。。。