当前位置: 首页 >Java技术 > 深入理解java虚拟机之——JVM垃圾回收策略总结

深入理解java虚拟机之——JVM垃圾回收策略总结

  • 如何判断一个对象是否存活

  引用计数算法:给对象中添加一个引用计数器,每当有引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用。

   Java虚拟机里面没有选用引用计数算法来管理内存,其中主要原因是他很难解决对象间相互引用的问题。

    例如:对象objA和objB都有字段instance字段,且互相赋值,但实际上这两个对象已经不可

  能被访问了,但因为他们互相引用着对方,导致他们的引用计数都不为0,于是导致他们无法回收。

  (Java中这种情况是可以回收的)

public class ReferenceGC {public Object instance = null;public static void testGC(){ReferenceGC objA = new ReferenceGC();ReferenceGC objB = new ReferenceGC();objA.instance = objB; objB.instance = objA;objA = null;objB = null;}}

     可达性分析算法通过一系列的称为"GC Root"的对象作为起点,从这些节点开始向下搜索,

  搜素所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何的引用链

  相连,就判定对象可以被回收。Java, C#等语言都是使用这种算法判读对象的存活的。

    GC Root的对象包括下面几种:

      虚拟机栈(栈帧中的本地变量表)中引用的对象

      方法区中类静态属性引用的对象

      方法区中常量引用的对象

      本地方法栈中JNI(Native方法)引用的变量

  • 引用

    Java1.2后对引用进行扩充,分为:

      强引用:类似 Object obj = new Object()这类引用,垃圾收集器永远不会进行回收

      软引用:用来描述一些还有用但非必须的对象。系统在内存溢出异常之前,将会把这些

    对象列入回收范围之中进行。二次回收。如果这次回收还没有足够的内存,才会抛出内存异常。

    SoftReference类实现。

      弱引用:比软引用更弱一些,也是用来描述非必须对象。回收发生在下次垃圾收集器回收时。

    WeakReference类实现。

      虚引用:最弱一种引用,虚引用无法影响对象其生存时间,也无法通过虚引用获得

    对象,唯一目的就是对象被垃圾收集器回收时,收到一个系统通知。PhantomReference类实现。

  • 对象生存还是死亡

    如果对象在进行可达性分析后发现没有与GC Roots相连的引用链,那么它将会被第一次标记并且进行

  一次筛选,筛选条件是该对象是否覆盖finalize()方法,是否执行过finalize()方法。如果为覆盖或执行过则

  对象死亡。

    如果覆盖finalize()且有必要执行finalize(),则对象放入F-Queue的队列中,之后由虚拟机自动建立,

  低优先级的Finalizer线程去执行这里的执行是指虚拟机会触发这个方法,但不承诺会等待它运行结束。

  (该方法不建议使用

  • 方法区回收

    方法区主要回收:废弃常量无用的类 

    废弃常量:例如一个字符串"abc"已经进入常量池中,但是当前系统没有其他地方引用这个字面量。 

    无用的类:

      该类的所有实例都已经被回收,也就是Java堆中不存在该类的任何实例

      加载该类的ClassLoader已经被回收

      该类对应的Java.lang.Class对象没有在任何地方被引用,无法再任何地方通过反射访问该类的

    方法。

  • 垃圾收集算法

    标记-清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有标记的对象,标记过

  程在上面提过。

    不足:1.效率问题,标记和清除两个过程效率不高

       2.空间问题,标记清楚产生大量内存碎片

    复制算法:将内存安装容量分为大小相等的两块,每次使用其中一块。当回收时,将存活的对象复制到

  为使用的内存中,清楚已使用过的内存。

    不足:内存缩小到运来的一半

    Java在新生代中采用这种算法,不过是将内存分为Eden和两块Survivor,每次使用Eden和其中的Suvivor

  当回收时,将Eden和Suvivor存活的内存复制到未使用的Suvivor空间。HotSpot默认Eden与Suvivor比例为

  8:1,相当于可以使用90%的内存,如果存活的内存超过Suvivor空间,就是用老年代进行分配担保。

    标记-整理算法:过程与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活

  的对象向一端移动,然后清理掉端边界以外的内存。

    分代收集算法:将内存划分成几块,各个区域采用最适当的收集算法。Java一般把Java堆分为新生代和老年代,

  按各个年代特点采用适当的算法。

  垃圾收集器:

    新生代:Serial收集器,ParNew收集器,Parallel Scavenge收集器

    老年代:CMS, Seral Old(MSC), Parallel Old收集器

    GI收集器

 

  



作者:huangyichun
来源链接:https://www.cnblogs.com/huangyichun/p/6395659.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/java/112900.html

标签:垃圾回收
分享给朋友:

“深入理解java虚拟机之——JVM垃圾回收策略总结” 的相关文章

安全认证框架——Shiro原理解析 2022年05月15日 21:54:14
常用锁原理的介绍(上) 2022年05月16日 18:33:06
Java实现1到n的倒数的累加和 2022年05月21日 11:41:44
TensorFlow 安装详解 2022年05月26日 22:05:12
性能优化|全面剖析类加载机制 2022年05月27日 22:31:06
小白入门指南|zookeeper快速入门 2022年05月27日 22:55:58
java总结文章 2022年05月28日 23:33:52