2.1.1 Java内存模型与内存管理
- Young Memory Generation (年轻代)
- Eden
- S0 (幸存区, Eden满后通过Minor GC将对象移动到这)
- S1 (幸存区, Eden满后通过Minor GC将对象移动到这)
- Old Memory Generation (老年代)
- Minor GC15次后还存活 / S1满后且Minor GC后, 将对象提前移动到老年代
- Permanent Generation (持久代)
- 方法区 (运行时常量, 静态变量, 方法代码)
- 运行时常量池(运行时常量, 静态方法)
- Memory Pool(存储不可变对象, 如String)
- Java Stack
- GC类型
- Minor GC
- Major GC
- Full GC
- 内存区域
- 堆, 存放对象实例, GC回收主要区域
- 方法区, 存储类信息, 常量、静态变量
- 虚拟机栈, 存储方法执行内存模型, 存储局部变量表, 动态链接, 方法出口
- 本地方法栈, 虚拟机是用到Native服务
- 程序计数器, 指令指示器, 线程私有
- 强弱软引用
- 软引用, 内存不足的时候JVM才回收该对象
- 弱引用, GC扫描到弱引用即回收
- 虚引用, 被GC收系统通知
2.1.2 GC Roots (可达性)
- System Class
- Class Loaded by Bootstrap/system class loader
- JNI Local
- Local variable in native code.
- JNI Global
- Global variable in native code.
- Thread Block
- Object referred to from a currently active thread block
- Thread
- a started, but not stopped, Thread
- Java Local
- Native Stack
- In or out params in native code.
- Java Stack Frame
- A Java stack frame, holding local variable
- 更多请参考Garbage Collection Roots
2.1.3 GC算法(年轻代主要采用复制算法, 老年代主要采用标记-整理算法)
- 标记清除算法
- 从根集合开始扫描, 标记需要回收的对象, 标记完成统计回收被标记对象
- 仅对不存活对象进行处理, 对于存活对象比较多的效率高, 但缺点是未对存活对象调整, 存在内存碎片
- 复制算法
- 分为活动区间和空闲区间, 对象均在活动区间; 从根集合开始扫描, 存活对象移动到空间区间, 把活动区间一次性回收, 并把空间区间变成活动区间
- 对象存活少极其高效, 缺点需要多一倍空间
- 标记-整理算法
- 基于标记清除算法优化, 清理后, 移动存活对象, 解决内存碎片问题
- 分代收集算法
2.1.4 垃圾回收器
- Serial
- JVM垃圾回收时, 需要暂停所有用户线程, 知道回收结束
- 年轻代采用复制算法, 老年代采用标记-整理算法
- ParNew
- ParallelScavenge
- ParallelOld
- CMS
- GarbageFirst(G1)
2.1.5 GC类型
- GC_EXPLICT, 主动调用
System.gc()
产生的GC事件
- GC_CONCURRENT, 堆内存增长到一定程度触发
- GC_FOR_MALLOC, 堆内存已满, 系统需要更多内存时触发
- GC_HPROF_DUMP_HEAP, 创建内存快照hprof触发
- GC_EXTERNAL_MALLOC, 当Bitmap和NIO Direct ByteBuffer对象分配外部存储触发