《深入理解java虚拟机》 - 需要一本书来融汇贯通你的经验(下)

  上一章讲到了类的加载机制,主要有传统派的 双亲委派模型 和 现代主义激进派的 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。

 

 

  额。。。

posted @ 2017-12-09 15:26  阿牛20  阅读(671)  评论(0编辑  收藏  举报