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

article/2025/9/19 13:46:30

目录

  • 一.GC的作用区域
  • 二.关于对象是否可回收
    • 1.可达性分析算法和引用计数算法
    • 2.四种引用类型
  • 三.垃圾收集算法
    • 1.标记-清除算法
    • 2.复制算法
    • 3.标记-整理算法
    • 4.分代收集算法
  • 四.轻GC(Minor GC)和重GC(Full 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的对象,就是可回收的对象。

在这里插入图片描述

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.标记-清除算法

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

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

在这里插入图片描述

2.复制算法

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

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

在这里插入图片描述

3.标记-整理算法

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

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

在这里插入图片描述

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:

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

http://chatgpt.dhexx.cn/article/pdXjOhwJ.shtml

相关文章

垃圾回收机制的各种疑问

目录 jvm的内存模型中&#xff0c;运行时数据区分为哪几个部分&#xff1f;JVM如何判断一个对象所占内存是可以被回收的&#xff1f;什么是年轻代&#xff1f;方法区和永久带的联系是什么&#xff1f;为什么要分年轻代和老年代&#xff1f;为什么新生代和老年代要采用不同的回收…

垃圾回收(GC) 很干,很全

说一下垃圾回收机制 垃圾回收主要针对的是JVM的堆内存,我讲一下我了解的hotspot实现的jvm, 分为新生代和老年代,按照以前的说法,还有一个永久代,永久代在方法区里(物理上跟老年代相连),保存了class信息,静态变量,常量池等, jdk1.8之后,方法区实现发生了变化,取消了永久代的概念…

浅谈垃圾回收机制

目录 前言&#xff1a; 1.标记清除&#xff08;主要&#xff09; 2.引用计数&#xff08;次要&#xff09; 3.一些注意的点 前言&#xff1a; JavaScript的垃圾回收机制是为了防止内存泄漏的&#xff0c;所谓的内存泄漏是指当已经不需要某块内存时这块内存还存在着&#xff…

通过图文给你讲明白java GC的垃圾回收机制

本文原链接 http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 1. JAVA GC 概述 JAVA GC采用了分代思想,将java堆分成新生代&#xff0c;年老代&#xff0c;永久代。GC算法主要有标记-清除&#xff0c;标记-压缩&#xff0c;复制算法。 新生代…

jvm垃圾回收是什么时候触发的? 垃圾回收算法? 都有哪些垃圾回收器

1.1。那究竟GC为我们做了什么操作呢&#xff1f; 1 &#xff0c;哪些内存需要回收&#xff1f; 2 &#xff0c;什么时候回收&#xff1f; 3 &#xff0c;如何回收&#xff1f; 这时候有人就会疑惑了&#xff0c;既然GC 已经为我们解决了这个矛盾&#xff0c;我们还需…

Java回收垃圾的基本过程与常用算法

目录 一、基本概述 二、垃圾分类 基本背景 举例说明各种引用类型的作用 强引用&#xff08;Strong Reference&#xff09; 软引用&#xff08;Soft Reference&#xff09; 弱引用&#xff08;Weak Reference&#xff09; 虚引用&#xff08;Phantom Reference&#xff…

java面试-GC垃圾回收机制

原理&#xff1a; GC是垃圾收集的意思&#xff08;Garbage Collection&#xff09;,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的。 简而言之&#xff0c;GC是将java的无用的堆对象进行清理&#xff0c;释放内存&#xff0c;以免发生内存泄露。…

JVM垃圾回收算法、GC和分代回收、三色标记并发漏标、垃圾回收器

一.标记清除 标记速度与存活对象线性关系 清除速度与内存大小线性关系 标记清除法分为标记阶段和清除阶段&#xff0c;标记阶段首先找到一些GC Root对象&#xff08;根对象&#xff09;&#xff0c;根对象是那些一定不能被回收的对象。清除阶段比较简单&#xff0c;加标记的对…

垃圾回收的主要区域是堆,那方法区会回收吗?

有些人认为方法区&#xff08;如HotSpot虚拟机中的元空间或者永久代&#xff09;是没有垃圾收集行为的&#xff0c;《Java虚拟机规范》中提到过可以不要求虚拟机在方法区中实现垃圾收集&#xff0c;事实上也确实有未实现或未能完整实现方法区类型卸载的收集器存在&#xff08;如…

GC(垃圾回收)详解

JVM 1.年轻代&#xff1a;年轻代主要存放新创建的对象&#xff0c;垃圾回收会比较频繁。(稍微讲细一点就是即可&#xff0c;年轻代分成Eden Space和Suvivor Space。当对象在堆创建时&#xff0c;将进入年轻代的Eden Space。垃圾回收器进行垃圾回收时&#xff0c;扫描Eden Spac…

java---垃圾回收算法(GC)

目录 一、如何判断一个对象是否存活 1.引用计数法 2.可达性分析法 二、垃圾回收算法 1.标记清除法 2.复制算法 3.标记整理法 4.分代算法 具体流程 注意事项 空间分配担保原则 总结 一、如何判断一个对象是否存活 Java 堆中存放着几乎所有的对象实例&#xff0c;垃圾…

Java - GC 垃圾回收

JVM中一个垃圾回收线程&#xff0c;它的优先级较低&#xff0c;正常情况下不会执行。JVM空闲或者当前内存不足时,才会触发垃圾回收线程执行,扫描内没有被引用的对象,将这些对象添加到要回收的集合中进行回收。 GC介绍 Garbage Collection 垃圾收集&#xff0c;监测对象是否可…

GC是如何判断一个对象为垃圾的?被GC判断为垃圾的对象一定会被回收吗?

一.GC如何判断一个对象为”垃圾”的 java堆内存中存放着几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”。那么GC具体通过什么手段来判断一个对象已经”死去”的&#xff1f; 1.引用计数算法(…

基于28181协议的视频与平台的对接

问题描述 将IPC摄像头接入平台进行观看&#xff0c;或使用28181/rtsp/rtmp/flv等协议将视频流分发到其他平台。 解决方案 WVP-PRO&#xff08;基于GB/T 28181-2016标准实现的流媒体平台&#xff09;&#xff0c;依托优秀的开源流媒体服务ZLMediaKit&#xff0c;提供完善丰富…

GB28181协议实现系列之----SDK Demo发布(7)

GB28181在终端的应用越来越广&#xff0c;但是一般很多做终端的厂家要加入到互联互通的GB28181网络协议栈中都必须招聘一些专业做GB28181的开发人员&#xff0c;并且需要对接各厂家的兼容性开发及对接调试工作&#xff0c;或是修改一些定制功能。安防市场一年有千亿以上的产值&…

GB28181协议之设备录像查询

目录 一、概述 二、GB28181录像文件查询 2.1 录像文件基本要求 2.2 命令流程 2.3 抓包文件抓图示例 三、国标平台介绍 一、概述 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接…

ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台

ZLMediaKitwvp-GB28181-pro&#xff0c;搭建28181协议视频平台 一&#xff0c;简介 ZLMediaKit:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架&#xff0c;支持大并发连接请求 一个基于C11的高性能运营级流媒体服务框架,项目地址&#xff1a;ZLMediaKit 特点&#xff1a; 基…

java gb28181网关_视频网关GB28181协议转换解决方案

原标题&#xff1a;视频网关GB28181协议转换解决方案 应用需求及问题&#xff1a; 四川某一所学校&#xff0c;校园内装置有上百个摄像头&#xff0c;学校监控系统是RTSP协议&#xff0c;现在需求要把校园的监控系统视频画面接入到公安系统里&#xff0c; 可公安系统只支持GB-T…

GB28181协议--校时

1、简介 根据《GB/T 28181 —2016》7.10、9.10的要求&#xff0c;GB28181设备网络校时功能描述如下&#xff1a; 联网系统内的IP 网络服务器设备宜支持 NTP(见IETF RFC2030) 协议的网络统一校时服务。 网络校时设备分为时钟源和客户端, 支持客户/服务器的工作模式; 时钟源应支…

GB28181协议常见几种信令流程(一)

在监控系统中&#xff0c;常见的摄像机设备互联协议有国际标准的ONVIF、国标的GB28181和各厂商的私有连接协议&#xff0c;本章从GB28181-2016中摘抄整理常见信令流程&#xff0c;如28181的会话/媒体通道、SIP基本注册/注销流程、客户端主动发起视频点播流程、设备控制流程等。…