一、什么样的对象需要回收
1、引用计数回收方式
oc中的回收机制,采用引用计数的方式,引用为0的时候回收对象。此方法易造成循环引用内存泄露
2、可达性回收方式
引用链没有被GC Root对象引用的对象,被当成无用对象进行回收。
GC Root:虚拟机栈,本地方法栈,方法区引用的对象
二、回收的算法
1、标记-清除
扫描内存,发现可回收的对象进行标记,然后清除。
确定易造成内存碎片
2、标记-整理
将需要回收的对象清除后,内存统一向左移动解决内存碎片的问题。
但是每次整理消耗性能严重
3、复制
将内存按1:1分为两部分,一块使用一块空闲,每次清除时将有用的对象复制到空闲区。统一清除使用区的数数据后,将空闲区转换成使用区
4、分代收集法
将内存分为:新生代,老年代,永生代
新生代分为8:1:1三块,将有用的对象复制到小的两块上,大的清除。小的都满了只后移动到老年代区域。
新生代一般采用复制清除,老年代采用标记-整理
三、发生内存清理的时间
新生代,老年代,永久代,某一个内存溢出。
申请内存失败会发生gc
主动调用gc
程序空闲时间
安全点:程序执行跳转,方法调用,循环分支语句的时候,可以Stop-The_World GC
安全区域:程序没有执行的时候,线程处于sleep状态或者blocked状态的时候,这时线程无法响应jvm的中断请求
四、常用的垃圾收集器
1、新生代收集器:
Serial:单线程串行收集器,复制算法,清理时会Stop-The-World
PraNew:Serial的多线程版。算法模式类似上
Parallel Scanvenge :高吞吐量
2、老年代收集器:
Serial Old:单线程串行收集器,作为CMS的后备方案
CMS:并行收集器,收集过程(只能和Serial、PraNew配合使用)
1.初始标记
2.并发标记
3.重新标记
4.并发清除
Parallel Old:老年代多线程标记整理算法
G1: