自己理解的gc算法
2018-02-28 20:08
106 查看
1、引用计数法
为每一个对象配备一个整型计数器。对于一个A对象,只要有任何一个对象引用了A,则A的引用计算器就加1,当引用失效时,引用计数器减1.只要A的引用计数器值为0,则对象A就不可能再被使用。
缺点:1)无法解决循环引用问题 2)计数器加减操作影响性能
2、标记清除法
通过根节点,标记所有从根节点开始的可达对象,因此未被标记的对象就是未被引用的垃圾对象。然后在清除阶段,清除所有未被标记的对象。
缺点:存在碎片,回收后的内存空间不再连续。在对象的对空间分配过程中,尤其是大对象的内存分配,不连续内存空间的工作效率要低于连续空间的
3、复制算法
将原有的内存空间分为两块相同的存储空间,每次只使用一块,在垃圾回收时,将正在使用的内存块中存活对象复制到未使用的那一块内存空间中,之后清除正在使用的内存块中的所有对象,完成垃圾回收。
优点:对象多时,效率高,不存在碎片
缺点:1)对象少时复制耗时不可取 2)存储空间折半
4、标记压缩算法
和标记清除算法一样,标记压缩算法也首先从根节点开始,对所有可达的对象做一次标记,但之后,它并不是简单的清理未标记的对象,而是将所有的存活对象压缩到内存空间的一端,之后,清理边界外所有的空间。这样做避免的碎片的产生,又不需要两块相同的内存空间,因此性价比高。
前提:对象比较少时 适用:老年代
新生代对象:存放年轻对象的堆空间,年轻对象指刚刚创建,或者经历垃圾回收次数不多的对象。
老年代对象:存放老年对象的堆空间。即为经历多次垃圾回收依然存活的对象。
5、分代算法
新生代对象朝生夕灭,大约90%的对象会很快回收,因此,新生代比较适合使用复制算法。
老年代的存活率是很高的,使用标记清除或者标记压缩算法可以提高垃圾回收效率。
分代的思想被现有的虚拟机广泛使用
为了支持高频率的新生代回收,虚拟机可能使用一种叫做卡表的数据结构,卡表为一个比特位集合,每一个比特位可以用来表示老年代的某一区域中的所有对象是否持有新生代对象的引用,卡表中每一位表示老年代4KB的空间,卡表记录为0的老年代区域没有任何对象指向新生代,只有卡表为1的区域才有对象包含新生代对象的引用,因此在新生代GC时,只需要扫面卡表为1所在的老年代空间,使用这种方式,可以大大加快新生代的回收速度。
6、分区算法 分区算法将整个堆空间划分为连续的不同小区间, 堆空间越大,一次GC所需的时间就越长,从而产生的停顿时间就越长。为了更好的控制GC产生的停顿时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理的回收若干个小区间,而不是整个堆空间,从而减少一个GC的停顿时间。
为每一个对象配备一个整型计数器。对于一个A对象,只要有任何一个对象引用了A,则A的引用计算器就加1,当引用失效时,引用计数器减1.只要A的引用计数器值为0,则对象A就不可能再被使用。
缺点:1)无法解决循环引用问题 2)计数器加减操作影响性能
2、标记清除法
通过根节点,标记所有从根节点开始的可达对象,因此未被标记的对象就是未被引用的垃圾对象。然后在清除阶段,清除所有未被标记的对象。
缺点:存在碎片,回收后的内存空间不再连续。在对象的对空间分配过程中,尤其是大对象的内存分配,不连续内存空间的工作效率要低于连续空间的
3、复制算法
将原有的内存空间分为两块相同的存储空间,每次只使用一块,在垃圾回收时,将正在使用的内存块中存活对象复制到未使用的那一块内存空间中,之后清除正在使用的内存块中的所有对象,完成垃圾回收。
优点:对象多时,效率高,不存在碎片
缺点:1)对象少时复制耗时不可取 2)存储空间折半
4、标记压缩算法
和标记清除算法一样,标记压缩算法也首先从根节点开始,对所有可达的对象做一次标记,但之后,它并不是简单的清理未标记的对象,而是将所有的存活对象压缩到内存空间的一端,之后,清理边界外所有的空间。这样做避免的碎片的产生,又不需要两块相同的内存空间,因此性价比高。
前提:对象比较少时 适用:老年代
新生代对象:存放年轻对象的堆空间,年轻对象指刚刚创建,或者经历垃圾回收次数不多的对象。
老年代对象:存放老年对象的堆空间。即为经历多次垃圾回收依然存活的对象。
5、分代算法
新生代对象朝生夕灭,大约90%的对象会很快回收,因此,新生代比较适合使用复制算法。
老年代的存活率是很高的,使用标记清除或者标记压缩算法可以提高垃圾回收效率。
分代的思想被现有的虚拟机广泛使用
为了支持高频率的新生代回收,虚拟机可能使用一种叫做卡表的数据结构,卡表为一个比特位集合,每一个比特位可以用来表示老年代的某一区域中的所有对象是否持有新生代对象的引用,卡表中每一位表示老年代4KB的空间,卡表记录为0的老年代区域没有任何对象指向新生代,只有卡表为1的区域才有对象包含新生代对象的引用,因此在新生代GC时,只需要扫面卡表为1所在的老年代空间,使用这种方式,可以大大加快新生代的回收速度。
6、分区算法 分区算法将整个堆空间划分为连续的不同小区间, 堆空间越大,一次GC所需的时间就越长,从而产生的停顿时间就越长。为了更好的控制GC产生的停顿时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理的回收若干个小区间,而不是整个堆空间,从而减少一个GC的停顿时间。
相关文章推荐
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- 冒泡法思想总结,自己理解
- 开始阅读prototype1.5(参照9esuLuciano blog的注释和自己的理解)第一天
- jsp和servlet的问题收集.... 答案有部分是自己理解的,可能有点差异
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- 由读《深入理解计算机系统》一书引发对程序本质的探讨以及自己的一些理解
- 关于委托自己的一点理解
- 自己理解的 关于java的回调
- 自定义struts(一)--咱家自己写的struts--我对struts的理解
- BDKR_hashz字符串(自己的理解)
- 自己对Java中==与equals比较的理解
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- SpringMVC框架初探(本文是自己学习SpringMVC框架的认识可能理解的不深,不喜勿喷)
- 排序算法C++实现 理论部分自己理解
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- 仅个人兴趣,自己通过搜索他人的成果,结合自己的理解,来分析discuz的代码。
- 发现Windows程序 最主要的还是要理解消息和窗口的相互调用,相互影响是如何实现的,才能更准确的去理解Windows程序,去编好自己想要的程序功能
- 在人工智能时代,我们更需要理解自己的智能 | 艾伦脑科学研究所所长STEP峰会演讲实录
- Java自己实现HTTP服务器来理解GET和POST区别
- 自己对精细化运维的理解