GC概述
引用计数法
根搜索算法(虚拟机基本采用这个方法)
引用分类
强引用: Object a = new A() 不会被回收
软引用:还有用但不是必须的对象,可以被回收,用softReference实现,回收掉弱引用后内存还不够就回收软引用
弱引用:非必须对象,比软引用还要弱,垃圾回收第一批
虚引用:最弱引用,一定会被回收
跨代引用
记忆集合和卡表
记忆集可以缩小GC时扫描的对象
主要使用卡精度,卡表是使用卡精度的记忆集的具体实现方式
垃圾回收步骤
跟搜索算法判断不可用
看是否有必要执行finalize
两个步骤执行完后对象仍然没人用就属于垃圾
使用finalize进行自救
GC类型
- Minor/YoungGC:发生在新生代的收集动作
- Major/OldGc:发生在老年代的GC,目前只有CMS收集器有这个行为
- MixedGC: 收集整个新生代和部分老年代,只有G1收集器有这个行为
- FullGC:收集整个java堆和方法区的GC
STW
无用类的定义
- JVM中该类所有实例都已经被回收了
- 加载该类的classLoader被回收了
- 没有任何地方引用这个类的对象
- 无法在任何地方通过反射访问这个类
GC算法
- 新生代使用复制算法
- 老年代使用标记整理法
标记清除法
GC后会产生很多内存碎片
复制算法
标记整理法
垃圾收集器
串行收集:GC单线程内存回收,暂停所有用户线程 如:Serial
并行收集: 多个GC线程并发工作,用户线程暂停 如:Parallel
并发收集:用户线程和GC线程同时执行,不暂停用户线程 如:CMS
仅针对hotspot虚拟机
串行收集器
Serial和Serial old, 是一个单线程的收集器,GC时一定会发生STW
只启用一个GC线程,并且暂停用户线程
并行收集器
ParNew/ParOld在老年代要配合CMS收集器
特点:
Parallel Scavenge和ParNew对比:
CMS收集器
特点:
指令: