GC(垃圾回收机制)

定义

GC(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。

作用

垃圾回收机制的引入可以有效的防止内存泄露、保证内存的有效使用,也减轻了 Java 程序员的对内存管理的工作量。

回收什么?

在JVM内存模型中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。因为它们的生命周期是和线程同步的,随着线程的销毁,它们占用的内存会自动释放,所以只有方法区和堆需要进行GC
在这里插入图片描述

垃圾收集器在对垃圾进行回收前,确定有哪些对象是“死亡”状态,在对他们进行回收

判断方法

引用计数算法(Reference Counting):堆中每个对象实例都有一个引用计数。当一个对象被创建时,就将该对象实例分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象实例的计数器+1),但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1。任何引用计数器为0的对象实例可以被当作垃圾收集。当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1。

可达性算法(根搜索算法GC Roots Tracing):从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点,无用的节点将会被判定为是可回收的对象。
GC ROOT对象:a) 虚拟机栈中引用的对象(栈帧中的本地变量表);b) 方法区中类静态属性引用的对象;c) 方法区中常量引用的对象;d) 本地方法栈中JNI(Native方法)引用的对象。
对象死亡(被回收)前的最后一次挣扎:通过可达性分析,那些不可达的对象并不是立即被销毁,他们还有被拯救的机会。如果要回收一个不可达的对象,要经历两次标记过程。首先是第一次标记,并判断对象是否覆写了 finalize 方法,如果没有覆写,则直接进行第二次标记并被回收。如果对象在finalize()方法中重新与引用链建立了关联关系,那么将会逃离本次回收,继续存活。

什么时候进行回收

1.会在cpu空闲的时候自动进行回收  
2.在堆内存存储满了之后  
3.主动调用System.gc()后尝试进行回收

怎么回收?

垃圾收集算法、垃圾收集器

在介绍收集算法之前先给出一个术语:Stop-the-world(STW).意味着 **JVM由于要执行GC而停止了应用程序的执行,并且这种情形会在任何一种GC算法中发生。**当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态直到GC任务完成。

垃圾收集算法

1.标记-清除(Mark-Sweep):从根集合(GC Roots)进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,此算法一般没有虚拟机采用。(效率低,产生不连续内存碎片)

2.复制(Copying):将内存分成两块容量大小相等的区域,每次只使用其中一块,当这一块内存用完了,就将所有存活对象复制到另一块内存空间,然后清除前一块内存空间。(复制代价高,适合新生代,浪费空间)

3.标记-整理(Mark-Compact):在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。不会产生内存碎片,但是依旧移动对象的成本。(适合老年代)

4.分代收集算法:分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),在堆区之外还有一个代就是永久代(Permanet Generation)。
在文章开头,已经说了垃圾回收机制主要负责回收方法区和堆的垃圾。方法区也叫做永久代。Java堆就包括新生代和老年代两部分

注意:在JDK 1.8中已经移除了永久代,改为元空间

在这里插入图片描述

工作流程如下:

1.所有新生成的对象都放在Eden,当 Eden区快要满了,触发Minor GC,把存活对象复制到 Survivor0区,清空 Eden 区;
2.Eden区被清空后,继续对外提供堆内存;当 Eden 区再次被填满,又触发Minor GC,对 Eden区和 S0 区同时进行垃圾回收,把存活对象放入 S1区,同时清空 Eden 区和S0区;
3.不断重复上面的步骤,每进行一次垃圾回收存活的对象年龄就会加1,默认临界值为15;
4.当到达临界年龄,对象就会被复制到老年代;
5.当老年代的被占满,无法再进入对象时,就会进行一次Full GC,也就是新生代、老年代都进行回收,这个垃圾回收的时间比较长。

垃圾收集器

新生代收集器:Serial,ParNew,Parallel Scavenge
老年代收集器:CMS,Serial Old,Parallel Old

Serial收集器:新生代单线程收集器,标记和清理都是单线程,优点是简单高效。是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定。
Serial Old收集器:老年代单线程收集器,Serial收集器的老年代版本。
ParNew收集器:新生代收集器,可以认为是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现。
Parallel Scavenge收集器:并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般为99%, 吞吐量= 用户线程时间/(用户线程时间+GC线程时间)。适合后台应用等对交互相应要求不高的场景。是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数。
Parallel Old收集器:Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先。
CMS(Concurrent Mark Sweep)收集器:高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择。

https://blog.csdn.net/weixin_41835916/article/details/81530733

https://blog.csdn.net/weixin_36027342/article/details/79973294

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值