如何确实某对象是“垃圾”?
答:如果一个对象没有任何引用与之关联,那么这对象就是要被回收的“垃圾”;
举例说明:ss=new AA();因为new AA()创建了一个AA类的实例对象,就得在内存中开辟空间存放这个实例对象;
后来ss被其他值覆盖,即ss=new BB();ss不再指向AA了,而指向BB了,而AA又没有被其他变量指向所以就没啥用了,像个幽灵一样飘荡在内存中,占用内存资源,所以它就是垃圾得被回收占用的内存资源;
垃圾回收的特点:
1、垃圾回收由虚拟机jvm执行;
2、垃圾回收的时机:不是说一个对象一旦变成垃圾就立马回收,而得等system空闲时才会通知jvm进行回收;
3、所以system.gc()方法被调用后并不一定立马执行;
垃圾回收常用的方法:1. system.gc(); 2. Runtime.getRuntime.gc(); 3.system.finalization(); finalize();
垃圾回收算法:
个人点评:感官的来说不就是确定某对象是垃圾然后回收吗,挺简单的怎么涉及到算法方面的,有什么好算的?我觉得有就一个可算点:跟百度搜索算法一样,其实算的就是怎样从茫茫对象中搜索出垃圾;但实际的“垃圾回收算法”根本就不是算搜索的,感觉够不上“算法”这么高大上的层次,说是“策略”更合适些;
1.引用计数算法
引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值加1;当删除一个指向自己的指针时,计数值减1,如果计数值减为 0,说明已经不存在指向该对象的指针了,所以它可以被安全的销毁了
2.标记-清除算法
标记-清除(Mark-Sweep)算法依赖于对所有存活对象进行一次全局遍历来确定哪些对象可以回收,遍历的过程从根出发,找到所有可达对象,除此之外,其它不可达的对象就是垃圾对象,可被回收。整个过程分为两个阶段:标记阶段找到所有存活对象;清除阶段清除所有垃圾对象。
3.标记-缩并算法
标记-缩并算法是为了解决内存碎片问题而产生的一种算法。它的整个过程可以描述为:标记所有的存活对象;通过重新调整存活对象位置来缩并对象图;更新指向被移动了位置的对象的指针。
4.节点拷贝算法
节点拷贝算法是把整个堆分成两个半区(From,To), GC的过程其实就是把存活对象从一个半区From拷贝到另外一个半区To的过程,而在下一次回收时,两个半区再互换角色。在移动结束后,再更新对象的指针引用,
作者:小小梦里花007 来源: 原文:https://blog.csdn.net/jim_007/article/details/54133832 版权声明:本文为博主原创文章,转载请附上博文链接!