Java GC 总结

Posted yghapsp

tags:

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

Java GC垃圾收集器

概述

关于JavaGC,有三件事情需要了解
1.那些内存需要回收
2.什么时候回收
3.这么回收

这么判断对象已死

引用计数法

用一个计数器表示对象的引用,对象被引用就+1,,引用失效-1.不过这个算法有一个问题,就是对象的相互引用,会使对象无法回收。比如A引用B,B引用A,这两个对象实际上已经没用了,但是无法回收。现在的虚拟机都不会通过该算法来判断对象

可达性分析算法

这个算法通过一系列称为"GC Roots"的对象作为起始点,当一个对象到GC Roots没有任何引用链相连时,则证明该对象没用了。
"GC Roots"包括:
1.虚拟机栈引用对象(局部变量表)
2.方法去静态属性引用对象
3方法去中常量引用的对象
4,本地方法栈中JNI引用对象
具体结构如下图

技术分享图片

垃圾回收算法

标记-清除算法

如同名字一样,分为标记和清除两步,这是最基本的收集算法,其他算法都是基于这个思路并且优化的。这算个标记和清除效率都不高,而且清除完后有很多不连续的内存碎片。

如图
技术分享图片

复制算法

就是将内存一分为二,将存活的对象复制到另一半,将原来的对象全部删除。
这个算法很浪费内存,浪费了一半的内存。
现在商业的虚拟机新生代都是采用这个算法但并不是1:1的比例,实际比例8:1,会划分为一个eden和两个Survivor空间,将eden和其中一个Survivor中存活的复制到另一个Survivor中,空间不足时以来老年代进行分配担保

如图:
技术分享图片

标记-整理算法

与清除一样,只是不直接清除,是先将存活的对象向一端移动,然后清理掉边界之外的内存

如图
技术分享图片

分代收集算法

将内存分为新生代、老年代和永生代三个区域,新生代因为每次会有大量对象死去,使用复制算法,老年代存活率高,没有多余空间对它进行分配担保,使用标记-清理或者标记-整理算法



以上是关于Java GC 总结的主要内容,如果未能解决你的问题,请参考以下文章

JVM学习——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html

JAVA GC 简单总结

Java GC工作原理以及Minor GCMajor GCFull GC简单总结

垃圾收集器与内存分配策略之篇三:理解GC日志和垃圾收集器参数总结

java ----------finalize方法总结GC执行finalize的过程

GC详解及Minor GC和Full GC触发条件总结