【JVM】垃圾回收机制详解(GC)

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

一.GC的作用区域

可以看jvm详解之后,再来理解这篇文章更好

堆和方法区,主要发生在堆中,然后主要发生在堆的伊甸园区(Eden)。

二.关于对象是否可回收

1.可达性分析算法和引用计数算法

Java中的垃圾回收是根据可达性分析算法(Reachability Analysis)引用计数算法来判断对象是否存活的。

可达性分析算法:
	简单来说这个算法的就是根据"GC Roots"对象为根,向下去搜索(去找叶节点),
搜索走过的路径叫引用链(Reference Chain),当一个对象和"GC Roots"之间没有
任何引用链时,这个对象就会判定为可回收的。
	下面示意图,因为"GC Root"有路径可以到达对象1到5,所以对象1到5是不可回
收的,然而"GC Root"没有任何路径可以到达对象6到8,所以对象6到8就是可回收的。

java中可作为"GC Roots"的对象:
(1)虚拟机栈中引用的对象
(2)本地方法栈内 JNI(本地方法,就是被native修饰的方法)引用的对象
(3)方法区中类静态属性引用的对象
(4)方法区中常量引用的对象

引用计数器算法:
	就是为每个对象都添加一个计数器,每多一个引用指向对象,计数器就加1,当计数器为0的对象,就是可回收的对象。

gc什么时候回收,jvm,java,算法

2.四种引用类型

JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。

  • 强引用

强引用的对象回收基于“可达性分析”算法,当对象不可达时才可能会被回收。就算jvm内存满了,会抛出OutOfMemoryErro,也不会回收强引用。例如:

Object obj=new Object(); //手动把对象置为null,jvm就会回收对象。

  • 软引用

软引用是说一些有用但是非必需的对象。在jvm内存即将满的时候,会将软引用关联的对象,进行回收,如果回收之后,内存还是不够,才会抛出OutOfMemoryErro。

JDK1.2之后,提供了SoftReference类来实现软引用。例如:

SoftReference ref = new SoftReference(refObj);

  • 弱引用

无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。

JDK1.2之后,提供了WeakReference类来实现弱引用。例如:

WeakReference ref = new WeakReference(refObj);

  • 虚引用

虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,随时可能会被回收

JDK1.2之后,提供了PhantomReference类来实现虚引用(构造的时候,需要指定一个队列)。例如:

ReferenceQueue referenceQueue = new ReferenceQueue<>();
PhantomReference ref = new PhantomReference(refObj,referenceQueue);

三.垃圾收集算法

1.标记-清除算法

标记-清除算法分为两个阶段:标记、清除。首先标记所有需要回收的对象,在标记完成后回收所有被标记的对象。

优点:算法比较简单。
缺点:会产生大量不连续的内存碎片,而且效率不高。

gc什么时候回收,jvm,java,算法

2.复制算法

这种算法会将内存划分为两个相等的块,每次只使用其中一块。当这块内存不够使用时,就将还存活的对象复制到另一块内存中,然后把这块内存一次清理掉。年轻区主要用复制算法,幸存区复制,一般都是from复制到to,谁空谁是to,适用与对象存活度较低。

优点:效率比较高,也避免了内存碎片。
缺点:因为另一半内存一直是空的,比较浪费空间。

gc什么时候回收,jvm,java,算法

3.标记-整理算法

是标记-清除算法的升级版,也叫标记-压缩算法。在完成标记阶段后,不是直接对可回收对象进行清理,而是让存活对象向着一端移动,然后清理掉边界以外的内存。

优点:避免了内存碎片和内存利用效率低。
缺点:增加了一个移动的成本。

gc什么时候回收,jvm,java,算法

4.分代收集算法

年轻代:存活率低-复制算法
老年代:区域大存活率高-标记清除+标记整理算法混合实现

四.轻GC(Minor GC)和重GC(Full GC)

Minor GC

当新对象去伊甸园区(Eden)申请内存失败的时候,就会进行Minor GC,对伊甸园区(Eden)回收非存活对象,而没有被回收的对象,会进入幸存区(Survivor),这种GC只发生在伊甸园区(Eden),不会影响到老年区。因为新对象分配内存大部分都在伊甸园区(Eden),所以伊甸园区(Eden)GC比较频繁。

注意:在GC之后,还存活的对象,进入幸存区(Survivor),谁空谁是to,可以交换位置,当一个对象经历了15次GC(可以配置次数:-XX:+MaxTenuringThreshold=15),还存活,就进入老年区。

Full GC

清理整个堆,因为Full GC需要对整个堆进行回收,所以比Minor GC慢,因为我们要尽可能的减少Full GC的次数。我们所说的JVM调优,很大一部分就是对Full GC的优化。

以下情况会造成 Full GC:文章来源地址https://www.toymoban.com/news/detail-534129.html

  • 老年区满了:年轻区的对象转入或创建大对象才会满。
  • 持久区满了(jdk7及之前版本)
  • 方法区满了(jdk8及之后版本):系统中要加载的类过多。
  • System.gc() 被显示调用
  • 通过Minor GC后进入老年代的平均大小大于老年代的可用内存:第一次Minor GC之后,有2MB的对象转入老年区,然后在下一次Minor GC的时候就会判断老年区的空间是否有2MB,如果没有就进行Full GC。

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

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月09日
    浏览(36)
  • Java JVM中的GC机制详解

    垃圾回收(Garbage Collection,简称GC)机制是JVM中最重要的部分之一。在Java程序运行的过程中,运行时数据区域(包括堆和栈等内存区域)一直都需要使用和回收内存空间。由于Java中的内存分配方式是动态的,所以在程序运行期间,其内存空间的占用量会不断变化。 如果Java程

    2024年02月14日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包