java中的垃圾回收算法
今天来讲讲java中的垃圾回收机制,要了解垃圾回收机制,我们就要先了解java堆,它的实现是什么。
java堆的实现:
在java中堆的实现像一个传送带,每分配一个新的对象,它就向前移动一格。这就意味着对象存储空间的分配非常的快,java的“堆指针”只是简单的移动到尚未分配的区域。
但是java堆未必完全像上面将的那样工作,因为如果真的是那样的话,一定会导致频繁的内存页面调度——将其移进移出硬盘,页面调度会影响性能,最终在创建足够多的对象之后,内存耗尽。因为java中有垃圾回收器,垃圾回收器工作的时候,一边回收空间,一边把堆中的对象紧凑排列。通过垃圾回收对对象的重新排列,实现一种高速的,有无限空间可以分配的堆模型。
java垃圾回收算法:
1.引用计数法
描述:每一个对象都有一个引用计数器,当有引用连接到对象的时候,引用计数加一,当引用离开作用域或者被置为null的时候,引用计数减一。
虽然管理引用计数的开销并不大,但是这项开销在整一个程序的生命周期中持续发生。垃圾回收器会在含有全部对象的列表上面遍历,当发现某个对象的引用计数为0的时候,就释放这个对象的空间。但是这种方法有一个缺陷:如果某个对象在循环中被引用,可能会出现“对象应该被回收,但是引用计数不为0的情况”。引用计数法通常用来说明垃圾回收的工作方式,但是好像没有哪一个java虚拟机是采用这种方式实现垃圾回收的。
2.自适应的垃圾回收技术:
一种更快的模型:对于任何“活”的对象,一定能够最终追溯到其存活在堆栈或静态存储空间的引用。由此,如果从堆栈和静态存储区开始,遍历所有的引用,就能找到所有“活”的对象。对于每发现一个引用,必须追踪到它引用的对象,然后是此对象的所有引用,如此反复进行,直到“根源于堆栈和静态存储区中所有的引用”所形成的网络全被访问为止。
在这种方式下,java虚拟机将采用一种自适应的垃圾回收技术。
自适应主要有两种方式:
1)停止—复制法&#