第③章 垃圾收集器与内存分配策略

这一节的主要内容讲的就是垃圾回收相关的内容,主要的有回收哪些内容?怎么回收?有哪些算法?

1.jvm都会收集哪些区域呢?

a)主要关注的是堆和方法区,因为在栈的内存随着函数的调用栈帧的开辟会被自动回收,所以不需要垃圾回收器来特别的关注。

2.这么回收呢?

a)首先判定哪些对象是存活的,对于非存活对象进行一系列的回收算法。下面都是详细为绕这个点讲的。

3.如何判定对象是存活的呢?

答:

     这里使用的是可达性的分析算法,就是通过一系列的称为GC ROOT的对象作为节点,然后从这个跟节点开始向下搜索,搜索过的路径称为引用链,当一个对象到GC ROOT没有引用链的时候,即到不可达的时候,则说明这个对象是不可用的即不是存活的,这种对象就要被回收。

      但是上述的引用链来判断对象是否被引用从而决定回收不回收的话显的太过于死板,比如有些对象在系统中可有可无的时候,但是他是被引用的对象,那么通过上面的可达性分析算法就没法回收这类对象。这样的话这种对象又占用着内存就很难搞,所以在JDK1.2之后,对于引用的定义,进行了扩充,增加了强引用,软引用,弱引用,虚引用。那么他们具体指什么呢?

      什么是 强引用,软引用,弱引用,虚引用?

      强引用就是Object obj=new ObJect(),new出来的对象就是强引用。只要这种引用关系还在的话,是绝对不会被垃圾回收器回收的。

     软引用的描述一些还有用但是不是必须的对象,软引用关联的对象,在系统将要发生内存溢出的时候,会进行一次垃圾回收,但是这次垃圾回收的过程不会回收软引用,而是将其放入回收的范围,进行第二次回收,如果第二次回收还没有内存,则抛出异常。SoftReference类来实现软引用

   弱引用描述的也是可有可无的对象,但是他比软引用还要可有可无。被弱引用的对象,只能活到下一次垃圾回收发生之前。当本次垃圾回收器开始回收的时候,无论内存够不够都回收弱引用的对象。WeaReference类来实现弱引用。

  虚引用他的引用粒度弱到你可以当他没有存在感,一个对象是否有虚引用,不会对其的生存周期造成任何影响,当然也无法通过虚引用取得一个对象的实例。设置虚引用的目的就是一个对象设置了虚引用关联则这个对象在被垃圾回收器回收的时候会受到系统通知。PhantomReference类实现引用。

好了既然知道了如何判断对象的存活,那么描述一下一个简单的垃圾回收过程?

答:即在可达性分析算法中一个对象没有引用链了也不是说必死无疑,他还有机会自救。怎么自救。就需要说一下垃圾回收的简单过程了。

第③章 垃圾收集器与内存分配策略

首先垃圾回收器开始工作了,进行可达性分析后发现一批对象没有引用链了,那么这些对象会被进行第一次标记,并且会对他们进行一次筛选。(筛选条件就是如果当前对象没有覆盖finalize方法或者当前的这个方法已经被执行了),这是一类,其次覆盖了没执行时一类。前面的这一类直接就被回收掉了,那么剩余后面这次覆盖了而且没执行,那么会将其放在FQuenue队列里面,然后由一个优先级比较低的线程Finalier去执行第二类这些对象的finalize方法(这里就是一个对象的自救的机会),稍后垃圾回收器会对F-Quenue队列中的对象进行第二次标记(即检查一下有没有自救成功的),如果没有则全部回收掉,如果有自救的则移除回收集合。他就自救成功了。