「Android面试题」JVM的垃圾回收之判断哪些内存需要回收

我们只有在程序运行期间才知道创建了哪些对象,这部分的内存的分配和回收是动态的。垃圾回收也是关注这部分的内存。了解内存回收我们主要从这几个方面入手:

1.哪些内存需要回收。

2.什么时候回收。

3.怎么回收。

也是说who,when,how。

先说第一个,哪些内存需要回收。

当然是不再使用的内存需要回收。我们主要是了解怎么判断,哪些对象占用的内存不再使用呢?使用下面这几个方法:

1.引用计数法

就是在对象被引用的时候,引用计数加一,引用失效的时候减一。当为0的时候就说明没有再被引用。可以回收。听上去很好,可惜不能解决循环引用的问题。所以JAVA中没有使用。

2.根搜索法

这个也叫可达性分析。这个算法的思路就是通过一些列名为“GC ROOts”的对象作为起始点,向下搜索。所有走过的路径,叫做引用链。当一个对象,他没有在任何GC ROOTS引用链的时候,那就是不可达。所以就是无用对象,可以被回收。

上面两种方法,都说到了引用。这里引用也有几种情况:

1.强引用

比如:Student s = new Student();只要强引用还在,GC就永远不可能回收他。

2.软引用

用来描述一些有用,但并非的对象。在即将发生OOM的时候,回收这些软引用的对象,但是回收之后还是不够内存,就会发出OOM。JAVA中有softrefrence类实现。

3.弱引用

也是用来描述一些非必须的对象,但是他比软引用要弱一些。在GC工作的时候,无论内存是否够用,都给他回收掉。WeakReferece类实现。

4.虚引用

从名字也可以看出,这是最弱的引用关系。为一个对象赋予虚引用不会影响这个对象的生存时间,也无法通过虚引用得到这个对象的实例。使用他的唯一目的就是希望这个对象被GC回收的时候,我们收到一个系统通知。PhantomReference类来实现。

展开阅读全文

页面更新:2024-04-23

标签:可达性   内存   目的   要强   算法   路径   实例   思路   对象   垃圾   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top