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工作原理以及Minor GCMajor GCFull GC简单总结
垃圾收集器与内存分配策略之篇三:理解GC日志和垃圾收集器参数总结