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做准备