垃圾收集器

判断对象的存活算法:

  1、引用计数算法:这个算法是在对象中添加一个引用计数器,一旦有一个地方引用过,就将计数器加一,当引用失效时,计数器减一。此算法难以解决对象之间相互引用的问题。

  2、可达性分析算法:这个算法的思路是通过一系列称为“GC Roots”的根节点作为起始节点集,从这些节点开始,通过上下引用关系搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Root之间没有任何引用链,则此对象就是不再被引用的。

引用:java关于引用分四种类型:强引用软引用弱引用虚引用

  1、强引用:“传统”的引用的定义,类似“Object o=new Object()”这种关系。在任何时候,只要强引用的关系存在,垃圾回收器就永远不会回收被引用的对象。

  2、软引用:一些还有用,但是非必须的对象。当内存将要发生溢出的异常前,会将这些引用进行二次回收,如果这次回收还没有足够的内存,就会抛出内存溢出异常。

  3、弱引用:它也是用来描述一些非必须的对象,但是它的强度比软引用还要弱一些。弱引用关联的对象只能存活到下一次垃圾回收之前。当垃圾回收器开始工作,无论当前的内存是否足够,被弱引用关联的对象都会被回收。

  4、虚引用:一个对象是否有虚引用的存在,完全不会对其生存空间有影响,并且无法通过虚引用取得一个对象的实例。这个引用唯一的目的是为了能在这个对象被回收时收到一个系统的通知。

垃圾收集算法:

  1、标记——清除算法:如同算法的名字,算法的过程是标记那些需要回收的内存,然后在回收的时候对有标记的内存进行回收。

  2、标记——赋值算法:常被简单称为复制算法。此算法将内存分为大小相等的两块区域,每次只用其中的一块区域,当这块内存用完了,将还存活的对象复制到另外一块内存上,然后对这块内存进行垃圾回收。后来提出了一种更为优化的半区复制分代策略,“Appel式回收”。“Appel式回收”的做法是将新生代分为一块较大的内存Eden和两块较小的内存空间Survivor(HotSpot虚拟机默认Eden和Survivor比例为8:1),每次新生代中可用的内存空间为90%。当发生垃圾回收的时候,存活的对象就会复制到另外一块Survivor内存上。

  3、标记——整理算法:此算法是让内存中还存活的对象向空间的一端移动,然后直接清理掉边界以外的对象。

 

参考:《深入理解Java虚拟机》第三版——周志明

posted @ 2022-05-23 20:37  知识怪人  阅读(22)  评论(0编辑  收藏  举报