Open zgq105 opened 5 years ago
GC机制是java特有的一种垃圾回收机制,管理内存中对象的回收工作。它的作用是减轻程序员的开发工作,不需要程序员手动管理对象的清理回收工作,加快开发效率。
强引用是指我们开发中默认创建的对象就是强引用;比如,Object obj = new Object()就是一个强引用,只要强引用存在GC就不会回收被引用的对象。(JVM宁可OOM都不会回收强引用的对象)
软引用是指当JVM中内存不足的时候,软引用的对象就会被GC回收。
弱引用是比软引用强度更弱些,只要下一次GC回收时,无论内存是否充足,弱引用的对象都会被回收。
虚引用是最弱的一种引用关系,基本是形同虚设。
注:四种引用关系由强到弱依次是强引用>软引用>弱引用>虚引用
引用计数算法是指每当一个地方引用到该对象时,计数器就会加1,;当引用失效时,计数器就会减1。 优点:
缺点:
可达性分析算法(根搜索算法)指通过GCRoots对象作为起始点,开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GCRoots没有任何引用链相连时,则证明此对象是不可用的。 优点:
知识点补充,GC-Root对象包括以下几个区域的对象:
标记-清除算法分为标记阶段和清除阶段。标记阶段主要采用可达性分析算法标记出可回收的对象;而清除阶段就是对标记过的对象进行清除。 优点:
将可用内存按照容量分为大小相等的两份,每次分配内存只使用其中的一块。当这一块内存用完了之后,将还存活的对象复制到另一块去,然后一次性回收这块内存区域。 优点:
标记整理算法包括标记过程、整理过程、清除过程。标记过程和标记-清除算法中标记的过程一样;整理过程是指将存活的对象完一边移动。清除过程就是直接清理掉端边界以外的内存。 优点:
根据对象存活周期不同,将堆内存分为新生代和老年代;根据不同年代采用不同的GC回收算法的过程称为分代算法。一般新生代存活时间短,采用复制算法回收;而老年代存活时间较长采用标记清除算法或则标记整理算法。 相关知识点:
JVM中GC机制解决了程序员手动管理内存释放的问题。提升了开发效率。但是在开发的过程中需要注意内存泄漏问题的产生。一旦还存在强引用,GC是不会回收该对象所占用的内存区域。
1. 什么是GC机制?作用?
GC机制是java特有的一种垃圾回收机制,管理内存中对象的回收工作。它的作用是减轻程序员的开发工作,不需要程序员手动管理对象的清理回收工作,加快开发效率。
2. 对象引用
2.1 强引用
强引用是指我们开发中默认创建的对象就是强引用;比如,Object obj = new Object()就是一个强引用,只要强引用存在GC就不会回收被引用的对象。(JVM宁可OOM都不会回收强引用的对象)
2.2 软引用
软引用是指当JVM中内存不足的时候,软引用的对象就会被GC回收。
2.3 弱引用
弱引用是比软引用强度更弱些,只要下一次GC回收时,无论内存是否充足,弱引用的对象都会被回收。
2.4 虚引用
虚引用是最弱的一种引用关系,基本是形同虚设。
注:四种引用关系由强到弱依次是强引用>软引用>弱引用>虚引用
3. GC判定算法
3.1 引用计数算法
引用计数算法是指每当一个地方引用到该对象时,计数器就会加1,;当引用失效时,计数器就会减1。 优点:
缺点:
3.2 可达性分析算法
可达性分析算法(根搜索算法)指通过GCRoots对象作为起始点,开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GCRoots没有任何引用链相连时,则证明此对象是不可用的。 优点:
缺点:
知识点补充,GC-Root对象包括以下几个区域的对象:
4. GC收集算法
4.1 标记-清除算法
标记-清除算法分为标记阶段和清除阶段。标记阶段主要采用可达性分析算法标记出可回收的对象;而清除阶段就是对标记过的对象进行清除。 优点:
缺点:
4.2 复制算法
将可用内存按照容量分为大小相等的两份,每次分配内存只使用其中的一块。当这一块内存用完了之后,将还存活的对象复制到另一块去,然后一次性回收这块内存区域。 优点:
缺点:
4.3 标记-整理算法
标记整理算法包括标记过程、整理过程、清除过程。标记过程和标记-清除算法中标记的过程一样;整理过程是指将存活的对象完一边移动。清除过程就是直接清理掉端边界以外的内存。 优点:
缺点:
4.4 分代算法
根据对象存活周期不同,将堆内存分为新生代和老年代;根据不同年代采用不同的GC回收算法的过程称为分代算法。一般新生代存活时间短,采用复制算法回收;而老年代存活时间较长采用标记清除算法或则标记整理算法。 相关知识点:
5. 小结
JVM中GC机制解决了程序员手动管理内存释放的问题。提升了开发效率。但是在开发的过程中需要注意内存泄漏问题的产生。一旦还存在强引用,GC是不会回收该对象所占用的内存区域。