垃圾回收与算法

JVM(java虚拟机)中对垃圾的回收处理(简称GC(garbage collection)),也是非常重要的一环

一、确立垃圾:

引用计数法:

它实际上是通过在对象头中分配一个空间来保存该对象被引用的次数。如果该对象被其它对象引用,则它的引用计数加一,如果删除对该对象的引用,那么它的引用计数就减一,当该对象的引用计数为0时,那么该对象就会被回收。

可达性分析:
从"GC roots"对象作为起点开始搜索,当一个对象搜索不到时(或者说没有路径可达),则称这个对象不可达。要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。在java中不采用引用计数法来确立判断对象是否可清除,因为可能存在两个都为null的对象相互引用的情况,这样这两个对象的计数值永远都为1。
就永远不会被删除。
二、垃圾回收算法:
1.标记清除算法(Mark-Sweep)
最基础的垃圾处理算法,分为标记和清除两个阶段,在标记阶段标记出需要回收的对象,然后再清楚阶段回收被标记对象所占用的空间。
但是这个算法有个很大的问题就是内存碎片会很多,这样可能导致后面的大对象找不到可用的空间。
2.复制算法(copying)
解决了标记清除算法的内存碎片问题。复制算法把内存分为两块,每次清除阶段,先把不回收的对象移到另外一块内存中,然后再清除这一块内存里被标记的对象。
但是这个算法会将能存储的内存限制到原来的一半,且如果内存存活的对象多的话,每次复制也会耗费很大的时间。
3.标记整理算法(Mark-Compact)
结合了上面两个算法,让所有存活的对象都向内存的一端移动,然后清除掉端边界外的对象。
4.分代收集算法
详解解释:https://blog.csdn.net/en_joker/article/details/79737533
目前大部分JVM采用的算法.它将内存划分为新生代和老年代.其实还有个永久代(主要存放class和Meta(原数据)的信息)
对于新生代:
采用复制算法.将新生代分为Eden Place,Survivor Place(From Place,To Place)三个空间.
每次清除时会将Eden Place和Survivor Place空间中的上一次存放的空间里的存活对象都移到另一个Survivor Place里,然后再去看前两个空间。
同时下一次存放的Survivor Place也会变成另外一个,如此循环移动。
对于老年代:
采用标记整理算法.因为老年代中每次只回收少量对象,所以采用标记整理算法.具体来说当一个存在对象在新生代中被循环次数达到了一个阙值(默认情况下为15)就会被转移到老年代中.
5.分区收集算法
分区算法将堆的空间分为几个小区间,每次合理控制多个小区间,可以减少GC的停顿.
三、GC垃圾收集器
JVM中针对新生代和老年代提供了多种不同的垃圾收集器。
对新生代:
1.Serial垃圾收集器
是一个单线程的收集器,采用复制算法。只会用单个CPU进行垃圾回收,且在Serial垃圾收集器回收时,会暂停所有其他的工作线程。不过比较简单高效
没有什么线程交互的开销,是大部分JVM中Client模式下新生代的默认垃圾收集器
2.ParNew垃圾收集器
是Serial的多线程版本,采用复制算法,虽然是多线程地回收垃圾,但是回收过程中依旧需要暂停所有其他的工作线程。
是大部分JVM中Server模式下新生代的默认垃圾收集器
3.Parallel Scavenge收集器
是一个多线程的收集器,采用复制算法,不过它有自适应调整策略,关注程序的吞吐量,高效地利用CPU,主要适用于在后台运算不需要太多交互的任务。
对老年代:
1.Serial Old收集器
是Serial的老年代版本,依旧是单线程,采用标记整理算法。是大部分JVM中Client模式下老年代的默认垃圾收集器
2.Paraller Old收集器
是Parallel Scavenge收集器的老年代版本,使用多线程的标记整理算法
3.CMS收集器
采用多线程的标记-清除算法,提供最短的GC停顿时间,对用户体验好
它有四个阶段:
1.初始标记:标记可达对象,需要暂停所有其他工作线程.
2.并发标记:进行GC Roots跟踪,可以和其他线程一起.
3.重新标记:修正前面变动的标记,需要暂停所有其他工作线程.
4.并发清除:清除GC Roots不可达对象,可以和其他线程一起.
4.G1收集器
Garbage first收集器,基于标记整理算法,不产生内存碎片,并且可以精准地控制GC停顿时间,在不牺牲吞吐量的情况下,实现低停顿回收.
它主要是把内存划分为几个分区,维护一个优先级列表,每次优先回收垃圾最多的分区,所以效率很高.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2022-03-15 19:02  levill  阅读(256)  评论(0编辑  收藏  举报