1.类的加载全过程
loadClass类加载过程
加载->验证->准备->解析->初始化->使用->卸载
加载:从硬盘查找,通过IO读取字节码文件,使用到类时加载。
验证: 验证字节码文件安全性。
准备: 给类常量变量分配内存,并赋予默认值。
解析: 将符号引用替换为直接引用
初始化: 给类的静态变量初始化指定值,执行静态代码块
2.双亲委派机制
类加载器:
引导类加载器:加载支撑JVM核心库,lib目录下的核心类库
扩展类加载器:加载支撑JVM扩展库,lib目录下ext目录下的jar包
应用程序类加载器:负责加载classPath下的类包,自己程序
自定义类加载器:加载自定义路径下的类包
双亲委派机制:
先找父亲加载,找不到由儿子加载
设计目的:沙箱安全机制,避免类重复加载
3.JVM架构和内存模型
4.垃圾清理算法
标记复制算法:
内存分为2份相同大小的块,将存活的内存块挪到另一边,再将使用的内存全部清理
标记清除算法:
分为2步,将活跃的内存块标记出来,清除未标记的内存。
缺点: 效率不高,如果内存块过多,标记对象就过多
内存空间不够,标记清除后产生大量不连续的内存块
标记整理算法:
和标记清楚算法一样,但是标记后会将存活的对象块向一端移动
5.三色标记算法
通过gc roots开始进行可达性分析,对是否访问过通过三种颜色标记
白色:对象未被垃圾回收期扫描过。可达性分析开始前,所有对象都是白色,结束后依旧是白色的对象,代表对象不可达。
黑色:对象已经被扫描过并且这个对象的所有引用也被扫描过。对象是安全存活的。
灰色:对象被扫描过,但是这个对象的引用没被扫描完。
增量更新
当黑色对象插入新的引用时,会将这个新插入的引用关系保存下来,等并发扫描完后再将这些保存的引用关系再次扫描一遍。
原始快照
灰色对象要删除指向白色对象的引用关系时, 就将这个要删除的引用记录下来, 在并发扫描结束之后, 再将这些记录过的引用关系中的灰色对象为根, 重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色。
6.垃圾收集器
1.Serial收集器
串行垃圾收集器,垃圾收集时会STW.
新生代采用复制算法,老年代采用标记-整理算法。
2.Parallel 收集器
多线程垃圾收集器,JDK8默认采用这种收集模式
3.ParNew收集器
parNew和Parallel一样,主要和CMS一起使用
4.CMS垃圾收集器

5.G1垃圾收集器
分为2048个region,默认年龄带占5%;Humongous区域存储大对象(如果大小超过region大小的50%,被认为大对象),fullGC时也回收大对象。
回收流程
初始标记(STW):记录gc roots的直接引用对象
并发标记:根据直接引用往下寻找标记
最终标记(STW):修复漏标
筛选回收(STW):根据设置的GC回收停顿时间,来进行回收价值和成本排序。
6.ZGC垃圾收集器
JDK11+新增的垃圾收集器,支持TB级别内存,最大GC时间小于10ms
不分代,使用了 读屏障、颜色指针 来实现标记-整理算法,以延迟为首要目标的一款垃圾收集器。
ZGC的Region分为大中小三类:
小型Region:固定大小2M,放置小于256K 的对象
中型Region:固定大小32M,放置大于256K小于4M的对象
大型Region:容量大小不固定,动态变化,必须是2M的倍数,存放4M以上的对象。
颜色指针:通过对象头位数划分