我们只有在程序运行期间才知道创建了哪些对象,这部分的内存的分配和回收是动态的。垃圾回收也是关注这部分的内存。了解内存回收我们主要从这几个方面入手:
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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号