JVM:垃圾回收机制(GC)

这篇具有很好参考价值的文章主要介绍了JVM:垃圾回收机制(GC)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

垃圾判断:

  1. 引用计数算法:

        在对象中添加一个引用计数器,当每有一个地方引用它时,计数器值加一。当引用失效时,计数器值就减一。当一个对象的计数器为零时,表示该对象没有被任何其他对象引用,因此可以被释放。

  • 优点:是可以及时回收垃圾对象,避免内存泄漏,且不会产生暂停时间。
  • 缺点:维护计数器会增加额外的开销。无法处理循环引用的情况,即两个或多个对象互相引用,导致它们的计数器永远不为零,无法被回收。主流的Java虚拟机里面都没有选用引用计数算法来管理内存。
  1. 可达性分析算法:

        通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。

GC Roots:虚拟机栈中引用的对象、在方法区中类静态属性引用的对象、在方法区中常量引用的对象、在本地方法栈中JNI引用的对象、所有被同步锁持有的对象。

图中虽然object4、object5、object6之间有互相引用,但它们到GC Roots不可达,所以它们被判定为可回收对象。

JVM:垃圾回收机制(GC),jvm,算法

再介绍一下引用的区别:

  • 强引用:最常见的引用类型,就是new出来的对象。只要有强引用指向对象,对象就不会被垃圾回收器回收。
  • 软引用:只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存, 才会抛出内存溢出异常。
  • 弱引用:被弱引用关联的对象只 能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只 被弱引用关联的对象。
  • 虚引用:一个对象是否有虚引用的 存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。

垃圾回收算法:

再将回收算法前我们需要了解两个假说:

  • 弱分代假说:绝大多数对象都是朝生夕灭的。
  • 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。

这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将Java堆划分 出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。

1、标记清除算法

        这个算法正如他的名字一样,算法分为“标记”和清除两个阶段。先把需要清除的对象进行标记,再标记完成后,统一回收掉所有被标记的对象,也可反过来,标记存活的对象,统一回收所有未被标记的对象。这是最基础的收集算法,后续大多数的收集算法都是以标记清除算法为基础。

缺点:第一个执行效率不稳定,如果有大量的对象需要清除,那么要进行大量的标记和清除,效率随回收对象的增长而降低(所以比较适合老年代)。第二个内存空间会存在碎片化问题,使其原本有足够大空间,但由于太过碎片化无法存大对象,从而不得不提前触发垃圾收集。

JVM:垃圾回收机制(GC),jvm,算法

2、标记复制算法

        这个算法主要是用来解决当有大量需要回收的对象时效率低下的问题。标记的不要回收的对象,但我们要操作的是不需要回收的对象,此时我们所需要的时间就会少很多。这个方法则是半区复制法。我们将内存等半分,每次只使用一块,当第一快内存用完之后,只要将还存活的对象复制到第二块去,然后将第一块内存清空。这样往复操作。这个操作简单高效,还解决了内存碎片化问题。缺点就是每次内存只能使用一半,太过于浪费。

JVM:垃圾回收机制(GC),jvm,算法

现在好多JVM大多使用这样是收集算法去回收新生代,但是并不是1:1的比例,而是将其划分为  Eden(8):Survivor(1):Survivor(1),每次分配内存只使用Eden和其中一块Survuvor,当发生垃圾收集时,将这个块Survuvor和Eden中存活的对象复制到空闲那块Survuvor上去,然后之间清空这个块Survuvor和Eden。这个比例是通过测试得来的合理分配。这样一来才浪费了10%的内存。可以接受。当然如果出现了某次意外,一个Survivor无法存放所有的存活对象,可以向老年代“借”内存用来存放。

3、标记整理算法

标记整理算法就是将需要回收的对象标记然后清除,最后将存活下来的对象进行整理。这样子即利用了100%的内存空间,又解决内存碎片化问题。但是如果是向老年区这个每次清除都有大量的对象存活的区域,那么移动对象也是很大的负担。所以一般都是先进行标记清除算法,待碎片化太过于严重再使用一次标记整理算法,解决碎片化。这样的方式被CMS收集器使用着。

ps:移动过程中要停止用户线程。

JVM:垃圾回收机制(GC),jvm,算法

 文章来源地址https://www.toymoban.com/news/detail-804913.html

 

 

到了这里,关于JVM:垃圾回收机制(GC)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM解密: 解构类加载与GC垃圾回收机制

    JVM 其实是一个 Java 进程,该进程会从操作系统中申请一大块内存区域,提供给 Java 代码使用,申请的内存区域会进一步做出划分,给出不同的用途。 其中最核心的是栈,堆,方法区这几个区域: 堆,用来放置 new 出来的对象,类成员变量。 栈,维护方法之间的调用关系,放

    2024年02月10日
    浏览(42)
  • 【Java】图解 JVM 垃圾回收(一):GC 判断策略、引用类型、垃圾回收算法

    垃圾 是指运行程序中 没有任何引用指向的对象 ,需要被回收。 内存溢出 :经过垃圾回收之后,内存仍旧无法存储新创建的对象,内存不够溢出。 内存泄漏 :又叫 “ 存储泄漏 ”,对象不会再被程序使用了,但是 GC 又不能回收它们。例如:IO 流不适用了但是没有被 Close、

    2024年02月19日
    浏览(44)
  • 小研究 - 浅析 JVM 中 GC 回收算法与垃圾收集器

    本文主要介绍了JVM虚拟机中非常重要的两个部分,GC 回收算法和垃圾收集器。从可回收对象的标记开始,详细介绍 了四个主流的GC算法,详细总结了各自的算法思路及优缺点, 提出了何种情况下应该通常选用哪种算法。 目录 1 标记可回收对象 1.1 引用计数器 1.2 可达性分析

    2024年02月14日
    浏览(32)
  • 【Java虚拟机】JVM垃圾回收机制和常见回收算法原理

    1.垃圾回收机制 (1)什么是垃圾回收机制(Garbage Collection, 简称GC) 指自动管理动态分配的内存空间的机制,自动回收不再使用的内存,以避免内存泄漏和内存溢出的问题 最早是在1960年代提出的,程序员需要手动管理内存的分配和释放 这往往会导致内存泄漏和内存溢出等问

    2024年02月02日
    浏览(45)
  • 【JVM】垃圾回收 GC

    垃圾回收(Garbage Collection,GC)是由 Java 虚拟机(JVM)垃圾回收器提供的一种对内存回收的一种机制,它一般会在内存空闲或者内存占用过高的时候对那些没有任何引用的对象不定时地进行回收。以避免内存溢出和崩溃的问题。JVM的垃圾回收算法包括引用类型、引用计数器法

    2024年01月16日
    浏览(45)
  • 【JVM】JVM垃圾回收GC相关参数说明

    -XX:+PrintCommandLineFlags : 输出JVM启动参数 -XX:+UseSerialGC :在新生代和老年代使用串行收集器 -XX:SurvivorRatio :设置eden区大小和survivior区大小的比例 -XX:NewRatio :新生代和老年代的比 -XX:+UseParNewGC :在新生代使用并行收集器 -XX:+UseParallelGC :新生代使用并行回收收集器 -XX:+UseParallelO

    2024年02月04日
    浏览(40)
  • JVM----GC(垃圾回收)详解

    Automatic Garbage Collection (自动垃圾回收)是JVM的一个特性,JVM会启动相关的线程,该线程会轮训检查heap memeory,并确定哪些是未被引用的(unreferenced),即未被使用的;哪些是被引用的(referenced),即正在使用的。 在C/C++语言中,对象内存的分配与回收,是手动进行分配与回收

    2024年02月09日
    浏览(42)
  • 02JVM_垃圾回收GC

    在 堆 里面存放着java的所有对象实例,当对象为“死去”,也就是不再使用的对象,就会进行垃圾回收GC 1.1引用计数器 介绍 在对象中添加一个引用计数器,当一个对象被其他变量引用时这个对象的引用计数器加1。当某个变量不再引用这个对象时引用计数器减1。当这个引用计

    2024年02月09日
    浏览(34)
  • JVM基础知识(内存区域划分,类加载,GC垃圾回收)

    目录 内存区域划分 JVM中的栈 JVM中的堆 程序计数器 方法区(元数据区) 给一段代码,某个变量在哪个区域上? 类加载 类加载时机 双亲委派模型 GC 垃圾回收机制 GC 实际工作过程 1.找到垃圾/判定垃圾 1.可达性分析(Java中的做法) 2.引用计数 2.清理垃圾 1.标记清除 2.复制算法 3.标记整

    2024年02月07日
    浏览(60)
  • JVM | 垃圾回收器(GC)- Java内存管理的守护者

    在编程世界中, 有效的内存管理 是至关重要的。这不仅确保了应用程序的稳定运行,还可以大大提高性能和响应速度。作为世界上最受欢迎的编程语言之一,通过Java虚拟机内部的垃圾回收器组件来自动管理内存,是成为之一的其中一项必不可少的技术点。 在许多传统的编程

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包