垃圾回收机制算法

1.什么是Java垃圾回收机制
在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。
2.说到回收机制我们就不得不谈一谈堆内存?
JAVA垃圾回收机制会不定时去清理堆内存中的不可达对象(就是程序不再使用的对象),对象回收是java自动做的,我们不能干预,只是能通过System.gc提醒java垃圾收集器该收集垃圾了。
java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
java堆分为新生代和老生代,顾名思义,新生代是java刚创建出来的,老生代里面是被引用了15次以上的对象,新生代与老生代的内存比列是1:2。
finalize方法作用是在垃圾回收一个对象时调用的,你可以在其中执行一些方法。
3.引用计数法
引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种方法的缺点就是不能检测到环的存在。引用计数法的逻辑是:在堆中存储对象时,在对象头处维护一个counter计数器,如果一个对象增加了一个引用与之相连,则将counter++。如果一个引用关系失效则counter–。如果一个对象的counter变为0,则说明该对象已经被废弃,不处于存活状态。
4.根搜索法
GC Roots,根搜索算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
下面的总结是引用别人的:
在这里插入图片描述
(1). 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
(2). 方法区中的类静态属性引用的对象。
(3). 方法区中常量引用的对象。
(4). 本地方法栈中JNI(Native方法)引用的对象。
也就是说对象要由这些GCRoots的引用,当对象与根链没有关联时,系统就认为该对象不可用了,也即是垃圾对象。
5.标记清除算法
这种算法就是在第一阶段时遍历所有的GC Roots给可用对象打个标记。第二阶段清除没有被标记的对象。由于这个算法的特性,该算法应用在老年代,因为老年代的生命周期比较长,该算法效率不是很高,万一对象太多,他要逐个扫描。而且还会产生内存碎片,是因为清理出来的空闲内存是不连续的,应为不可达对象分布在内存各个空间中.
6.复制算法
复制算法就是为了解决标记算法内存碎片的问题,一开始就会将可用内存分为两块,from域和to域, 每次只是使用from域,to域则空闲着。当from域内存不够了,开始执行GC操作,这个时候,会把from域存活的对象拷贝到to域,然后直接把from域进行内存清理,这样的缺点就是用空间换时间了,因为始终有一块to区为空闲区域。
7.标记压缩算法
标记压缩算法是在标记清除算法之上来解决内存碎片化的问题。

在这里插入图片描述
从图中可以看出算法的执行情况,将对象移动到一个区域,不考虑对象之前的排列或则对象之间的引用,在这个基础之上,再将有引用的对象尽可能的排列在一起。
这个方法解决上面标记清楚算法的内存碎片化的问题,但是却增加了内存的性能负担,因为要移动对象,需要更新引用。
8.分代算法
分代算法就是根据对象的存活周期不同将内存划分成几个块,新生代和老年代,这样就可以根据各个年代的特点进行适当的收集算法,新生代对象数量多,而且容易死亡,只要重点扫描这个区域,那么就可以大大提高垃圾收集的效率。另外老年代对象存储久,无需经常扫描老年代,避免扫描导致的开销。

  1. 新生代

每次垃圾收集器都发现有大批对象死去,只有少量存活,采用复制算法,只需要付出少量存活对象的复制成本就可以完成工作。

  1. 老年代

而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须“标记-清除-压缩”算法进行回收。
最后在来看看:

Minor GC和Full GC
新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。
老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Major GC,经常会伴随至少一次的 Minor GC(但非绝对的,在 ParallelScavenge 收集器的收集策略里就有直接进行 Major GC 的策略选择过程) 。MajorGC 的速度一般会比 Minor GC 慢 10倍以上。Full GC 是清理整个堆空间—包括年轻代和老年代。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值