垃圾回收问题

Posted 大大控

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了垃圾回收问题相关的知识,希望对你有一定的参考价值。

上次写了JVM的一点基础,这次补充点,顺便写一下垃圾回收。上次写的有点粗糙。

JVM有五大块

1、程序计数器:是一块很小的内存,可以看作是对于现在进程执行的字节码行号的指示器。程序计数器需要记录当前线程执行到哪一步了,以便下一次CPU可以在这个记录点上继续执行。

2、虚拟机栈:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。

3、本地方法栈:和虚拟机栈很相似,不过虚拟机栈执行的是Java方法,而这里本地方法栈则是为native方法服务。

4、Java堆:这块内存区域的目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做GC 堆。

5、方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

注意:1、方法区虽然有些地方被描述为堆的一个逻辑区域,但是这只是由于垃圾回收机制扩展到了方法区,方法区并不是堆的一部分。

      2、Java堆和方法区是线程共享的,其他三个都是线程私有的。

 

四种垃圾回收算法

垃圾回收之前,会对可回收对象进行检测标记,有两种算法

1、一种叫做引用计数法,通俗讲就是给对象一个计数器,有引用指向该对象计数加一,垃圾回收的时候发现未被使用就清除。虽然JVM中都已经不用这种算法了,但是这种算法还是有自己的优势,并未被淘汰,现在Redis中仍然采用这种算法来进行内存回收。

2、另一种叫做可达性分析,从GCRoots从上往下搜索,搜索经过的路径叫做引用链,当一个对象到GCRoots没有找到引用链时,就说明该对象可被回收。

下面介绍四中垃圾回收算法

1、标记清除算法:这种算法简单理解就是将标记的个直接清理掉,简单直接,但是缺点就是会产生很多的内存碎片.

2、复制算法:改进了上面的标记清除算法,顾名思义,就是把一块内存平均分成两份,一次只用一半,未被标记的对象全部复制到另一半,然后把之前那边全部清除,这种算法好处就是简单,彻底,在复制到另一边的时候可以合理地使用那一半内存,解决了内存碎片问题,但是当需要清理的垃圾很少时,需要复制的工作就会很多,而且内存只有一半是可用的。所以就出现了下面的方法。

3、标记整理算法:我们现在就要考虑,能不能结合前面两种算法的优势来处理呢。标记整理算法就是我们把未被标记为垃圾的全部移动到内存中的一块区域,也就是集中到一起,整理,然后将边界以外的全部清除,听起来和复制算法很相近,但是内存没有了一半的保留区域。缺点还是有,每次清除的时候都需要先整理,移动对象,成本还是挺高的。                  

4、分代回收算法:也就是现在JVM里Java堆中使用的垃圾回收算法,下面详细介绍。

分代回收

分代回收,听到这名字先分析一波,分成不同的代来进行垃圾的处理,那分为那些代呢。在Java堆中,分成了年轻代和年老代。

年轻代,听名字就知道,这里面存放的肯定是年轻的对象,而相对的,年老代放的便是年龄大的对象。

年轻代又可以分为Eden和Survivor两个区,我们暂且称它们为伊甸园和幸存者,Survivor中也分成了大小相同的两块区域,From和To。

接下来又是看名字猜意思环节,伊甸园,幸存者,那也就是说从伊甸园逃出去的成了幸存者?

在Java堆中,我们新建的对象是先使用Eden区,Eden中对象到达一定程度,就会采用复制算法将还存活的复制到From中,而那些临时对象已经死亡的就会被留在Eden中彻底清除掉,Eden中继续接受新的对象,当又用完了的时候,注意,这次不一样了,我们吧Eden和From一起进行复制,将存活对象复制到To,然后吧Eden和From清掉。然后再下次的时候就轮到Eden和To中的一起扔到From中,也就是From和To的轮换使用,这样,会有很多“老不死”的对象不停地在From和To中游荡,前面的每次清除我们称之为Young GC,每经过一次,这些存活的对象的age便会+1,当他们age达到一定的值(阈值),From和To就再容不下他们来,就会把他们扔进老年代。老年代中都是些“老不死”的对象,但是仍然需要垃圾回收,当老年代满时就会触发Old GC,老年代中采用的就是上面介绍的标记整理算法。

Young GC也称作Minor GC,Old GC也被称作Major GC,而我们认为一次Old GC也是一次Full GC,因为我们Old GC会伴随着Young GC,在进行Young GC时,我们把那些“老不死”扔进老年代的时候导致老年代满了,触发了Old GC,这个阶段我们整个堆中的对象都在进行垃圾回收,所以我们称为Full GC。

重要的事情!祝自己所有笔试所有面试都能过!offer拿到手软!来看我博客的你们也是- -。

以上是关于垃圾回收问题的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记3.11.1 垃圾回收 - 垃圾回收的作用

JVM垃圾回收优化实战-G1垃圾回收器

垃圾回收垃圾回收器2

Java中垃圾回收有啥目的?啥时候进行垃圾回收?

GC垃圾回收(3)- 三色标记算法

垃圾回收机制