《码出高效》第四章

31 Aug 2021

Reading time ~10 minutes

4.1 字节码

计算机工程领域的任何问题都可以通过增加一个中间层来解决。

字节码主要指令如下:

  • 加载或存储指令
    • 将局部变量加载到操作栈中
    • 将操作栈顶存储到局部变量表
    • 将常量加载到操作栈顶
  • 运算指令
  • 类型转换指令
  • 对象创建与访问指令
    • 创建对象指令
    • 访问属性指令
    • 检查实例类型指令
  • 操作栈管理指令
    • 出栈指令
    • 复制栈顶元素并压入栈
  • 方法调用与返回指令
  • 同步指令

字节码必须通过类加载过程加载到JVM环境后,才能执行。执行有三种模式:

  • 解释执行
  • JIT编译执行
  • JIT编译执行与解释混合执行

JIT的作用是将Java字节码动态地编译成可以直接发送给处理器指令执行的机器码。

4.2 类加载过程

  • Load:加载
  • Link:链接
    • 验证
    • 准备
    • 解析
  • Init:初始化

类加载器:

  • Bootstrap
  • Platform/Extension ClassLoader
  • Application ClassLoader

低层次的当前类加载器,不能覆盖更高层次类加载器已经加载的类。

什么情况下需要自定义类加载器呢?

  • 隔离加载类
  • 修改类加载方式
  • 扩展加载源
  • 防止源码泄露

4.3 内存布局

  • Heap(堆区)
    • 堆区分为两大块:新生代和老年代
    • 新生代 = 1个Eden区 + 2个Survivor区
    • 当Eden区装填满的时候,会触发Yong Garbage Collection
    • Survivor区分为S0和S1两块内存空间
  • Metaspace(元空间)
    • JDK8使用元空间代替永久代
  • JVM Stack(虚拟机栈)
    • 局部变量表
    • 操作栈
    • 动态连接
    • 方法返回地址
  • Native Method Stacks(本地方法栈)
  • Program Counter Register(程序计数寄存器)

4.4 对象实例化

  • 确认类元信息是否存在
  • 分配对象内存
  • 设定默认值
  • 设置对象头
  • 执行init方法

4.5 垃圾回收

垃圾回收的主要目的是清除不再使用的对象,自动释放内存。

垃圾回收算法:

  • 标记-清除算法
  • 标记-整理算法
  • Mark-Copy算法

垃圾回收器:

  • Serial回收器
    • 主要应用于YGC的垃圾回收器
    • 采用串行单线程的方式完成YGC任务
  • CMS回收器
    • 回收停顿时间比较短
    • 通过初始标记、并发标记、重新标记、并发清除四个步骤完成垃圾回收工作
  • G1回收器
    • 将Java堆空间分割成若干相同大小的区域,即region
    • 包括Eden、Survivor、Old、Humongous
    • G1的Concurrent Marking分为五个步骤
      • Initial Mark,其实就是YoungGC
      • Root Region Scan,根区域扫描
      • Concurrent Mark,并发标记
      • Remark,重新标记
      • Cleanup,为接下来的Mixed GC做准备


Reading NotesEasy Coding Share Tweet +1