1. JVM
JVM全称是 Java Virtual Machine ,即 Java虚拟机,是指能执行标准 Java 字节码的虚拟计算机。Java 字节码文件,是指 Java 源代码编译后的中间代码。字节码理论上支持256个操作码,实际目前使用了200个左右。主要有以下 4 类操作码:
- 栈操作指令,包括与局部变量交互的指令
- 程序流程控制指令
- 对象操作指令,包括方法调用指令
- 算术运算以及类型转换指令
方法调用的指令:invokestatic,invokespecial,invokevirtua,invokeinterface,invokedynamic
JVM 内存结构包括:
-
栈
- 线程栈
- 栈帧
- 返回值
- 局部变量表
- 操作数栈
- 栈帧
- 线程栈
-
堆
- 年轻代
- Eden space
- S0:任何时刻,S0、S1总有一个是空的
- S1
- 老年代
- 年轻代
-
非堆(non-heap):本质还是 Heap,只是一般不归 GC 管理
- 元数据区(Metaspace)
- compressed class space: 存放 class 信息,和 Metaspace 有交集
- code cache:存放 JIT 编译器编译后的本地机器代码
-
JVM 自身
JVM 命令行工具:jps/jinfo,jstat,jmap,jstack,jcmd
JVM GC:
| 收集器 | 串行、并行或并发 | 新/老年代 | 算法 | 目标 | 适用场景 |
|---|---|---|---|---|---|
| Serial | 串行 | 新生代 | 复制算法 | 响应速度优先 | 单CPU client 模式 |
| Serial Old | 串行 | 老年代 | 标记-整理 | 响应速度优先 | 单CPU client 模式,CMS后背预案 |
| ParNew | 并行 | 新生代 | 复制算法 | 响应速度优先 | 多CPU 配合 CMS Server 模式 |
| Parallel Scarvenge | 并行 | 新生代 | 复制算法 | 吞吐量优先 | 在后台计算而不需要太多交互的任务 |
| Parallel Old | 并行 | 老年代 | 标记-整理 | 吞吐量优先 | 在后台计算而不需要太多交互的任务 |
| CMS | 并发 | 老年代 | 标记-清除 | 响应速度优先 | 集中在互联网站或 B/S 系统服务端上的Java服务 |
| G1 | 并发 | 都有 | 标记-整理+复制 | 响应速度优先 | 面向服务端应用,将来替代CMS |
2. NIO
五种 IO 模型:
| 模型 | 阻塞或非阻塞 | 同步异步 | 场景模拟 |
|---|---|---|---|
| 阻塞I/O | 阻塞 | 同步 | 亲自去窗口打饭,打好了才回座位吃 |
| 非阻塞I/O | 非阻塞 | 同步 | 亲自去窗口打饭,打饭师傅会立刻告知是否准备好,准备好则端去吃,无论是否准备好都要回到座位 |
| I/O复用 | 阻塞 | 同步 | 去餐馆坐下吃饭,有专人分配自动响应号牌,专人会轮询的方式检查哪位食客的菜好了,好了会异步调用号牌(发声和光) |
| 信号驱动I/O | 非阻塞 | 同步 | 在餐馆里手机点餐,叫到自己的号后去去餐 |
| 异步I/O | 非阻塞 | 异步 | 点外卖 |