接触C/C++的同学不可避免的要懂对象的创建和销毁,学习Java的同学完全的避免了这一难题(有多难,试试就知道了,当然还有指针-_-)。
不过,了解Java的内存回收机制还是很重要的,因为你不可能一直停留在编写应用程序的初级阶段上,所以我们先了解几种垃圾回收的算法。
(一)引用计数法
这种算法应该算是比较简单的了。
简单来说,new 了一个对象之后,给它一个计数器,当有引用指向这个对象时,计数值加1;删除一个指向时,便减1。当计数值为0时,表示该对象可以被销毁了,所占空间可以被释放了。
该算法的缺点就是要为每个生成的对象维护一个引用计数,不断的更新该计数,这样势必在成时间和空间上的部分开销。
不过,这个算法的重要的缺点就是没有办法解决循环引用的问题。所以Java虚拟机JVM没有采用这个算法。
(二)标记-清除法
这个算法依赖于对所有存活对象进行一次全局遍历来做成一个对象图,确定哪些对象可以回收。遍历的过程从根出发,找到所有可达对象,其它不可达的对象就是垃圾对象,可被回收。整个过程分为两个阶段:标记阶段找到所有存活对象;清除阶段清除所有垃圾对象。
这个算法很好的解决了对于有些对象循环不可达的问题。可缺陷也很明显,就是会产生大量的内存碎片。因为刚开始分配的时候内存是连续的,经过一段时间的使用之后内存就会变得不连续。
(三)标记-缩并法
标记-缩并算法是为了解决内存碎片儿提出的一种算法。
原理是:标记所有存活的对象,通过重新调整存活对象的位置来缩并对象图。然后更新指向被移动了的对象的引用(指针)。
难点在于选择合适的压缩算法来提高算法性能。
(四)节点拷贝算法
将整个堆分成两个区,GC将存活对象从一个半区拷贝到另一个半区,下一次回收时,将两个半区的角色互换。移动结束后,更新对象的引用。
缺点是需要更大的空间。
最近看到jvm了,所以就看看垃圾回收,写篇文章来记些东西。
有不明白的同学可以看看下面的这篇文章
参考博文:
http://blog.csdn.net/yclzh0522/article/details/6982442