java虚拟机组成
类加载子系统、方法区、java堆、java栈、执行引擎、PC寄存器、垃圾回收系统、本地方法栈、 直接内存
类加载子系统,从内存或通过http加载Class信息,信息存至方法区
垃圾回收器
Serial收集器,串行收集器,最稳定以及效率最高的收集器
ParNew收集器,Serial的多线程版本
垃圾回收算法
标记-清理算法,将可回收的对象标记,启用一个GC线程执行清理,内存空间不连续,清理效率低
标记-整理算法,将可回收的对象标记并整理到一起,启用一个GC线程执行清理,内存空间连续,清理效率高
复制算法,将虚拟机堆分块,先用一块,当块存满以后,将所有存活的对象复制到另外一块,再清理一用的那块内存;注意,现在jvm的新生代都是使用复制算法执行回收(eden、from、to)
分代收集算法,根据存活周期划分几块内存,根据各个年代的特点使用最适合的收集算法
垃圾收集器和算法对应情况
名字 | 算法 | 区域 | 并发 |
Serial | 复制算法 | 新生代 | 否 |
Serial Old | 标记整理 | 老年代 | 否 |
ParNew | 复制算法 | 新生代 | 是 |
Parallel Scavenge | 复制算法 | 新生代 | 是 |
Parallel Old | 标记整理 | 老年代 | 是 |
CMS | 标记清理 | … | 是 |
G1 | 标记整理 | … | 是 |
对象回收确认算法
引用计数法,给对象加一个引用计数器,被引用就+1;引用失效时就-1;任何时刻计数器都为0时,就代表对象可回收了;注意,这个算法有个缺陷,对象想回间的引用
根搜索算法,根节点“GC-ROOT”,延根节点往下搜索,搜索走过的路径称为引用链,当一个对象没有任何引用链到达GC-ROOT时,就说明该对象可回收了
注意,可作为GC-ROOT的对象
a、虚拟机栈中的本地变量表
b、方法区中的静态属性引用对象
c、方法区中的常量应用对象
d、本地方法栈中native方法的引用(JNI)