java 技术:jvm垃圾回收机制有哪些

来源:互联网 发布:朝鲜导弹知乎 编辑:程序博客网 时间:2024/05/16 08:53

1.引用计数算法

引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值加1;当删除一个指向自己的指针时,计数值减1,如果计数值减为0,说明已经不存在指向该对象的指针了,所以它可以被安全的销毁了。

引用计数的明显缺点:无法处理环形引用

遍历所有的栈去解决

算法特点

  1. 需要单独的字段存储计数器,增加了存储空间的开销;

  2. 每次赋值都需要更新计数器,增加了时间开销;

  3. 垃圾对象便于辨识,只要计数器为0,就可作为垃圾回收;

  4. 及时回收垃圾,没有延迟性;

  5. 不能解决循环引用的问题;

2. 标记-清除(Mark-Sweep)算法

例如: Lua就采用了mark-sweep的垃圾回收机制

标记-清除(Mark-Sweep)算法依赖于对所有存活对象进行一次全局遍历来确定哪些对象可以回收,遍历的过程从根出发,找到所有可达对象,除此之外,其它不可达的对象就是垃圾对象,可被回收。整个过程分为两个阶段:标记阶段找到所有存活对象;清除阶段清除所有垃圾对象。

优点

  • 相比较引用计数算法,标记-清除算法可以非常自然的处理环形引用问题,

  • 另外在创建对象和销毁对象时时少了操作引用计数值的开销

缺点

  • 标记-清除算法是一种“停止-启动”算法,在垃圾回收器运行过程中,应用程序必须暂时停止

  • 标记-清除算法在标记阶段需要遍历所有的存活对象,会造成一定的开销

  • 在清除阶段,清除垃圾对象后会造成大量的内存碎片。

3. 标记-缩并算法(解决内存碎片)

整个过程可以描述为 
* 标记所有的存活对象; 
* 通过重新调整存活对象位置来缩并对象图; 
* 更新指向被移动了位置的对象的指针。

标记-压缩算法最大的难点在于如何选择所使用的压缩算法,如果压缩算法选择不好,将会导致极大的程序性能问题,如导致Cache命中率低等。一般来说,根据压缩后对象的位置不同,压缩算法可以分为以下三种:

  1. 任意:移动对象时不考虑它们原来的次序,也不考虑它们之间是否有互相引用的关系。

  2. 线性:尽可能的将原来的对象和它所指向的对象放在相邻位置上,这样可以达到更好的空间局部性。

  3. 滑动:将对象“滑动”到堆的一端,把存活对象之间的自由单元“挤出去”,从而维持了分配时的原始次序。

4. 节点拷贝算法(解决内部碎片)

节点拷贝算法是把整个堆分成两个半区(From,To), GC的过程其实就是把存活对象从一个半区From拷贝到另外一个半区To的过程,而在下一次回收时,两个半区再互换角色。在移动结束后,再更新对象的指针引用

参考 
http://blog.csdn.net/sinat_36246371/article/details/53002209 

简单,高效,空间换时间。


0 0
原创粉丝点击