垃圾回收机制

article/2025/10/8 2:19:15

1.常见误区

1.垃圾回收线程的优先级很高,以保证不再使用的内存将被及时回收。
(垃圾回收再jvm中优先级相当相当低。当程序运行时,至少会有两个线程开启启动,一个是我们的主线程,一个时垃圾回收线程,垃圾回收线程的priority(优先级)较低 )
2.垃圾回收允许程序开发者明确指定释放哪一个元素。
(程序开发者只能建议jvm进行回收,但何时回收,回收哪些程序员不能控制。垃圾回收器会对我们使用的对象进行监视,当一个对象长时间不使用时,垃圾回收器会在空闲的时候(不定时)对对象进行回收,释放内存空间,程序员是不可以显示的调用垃圾回收器回收内存的,但是可以使用System.gc()方法建议垃圾回收器进行回收,但是垃圾回收器不一定会执行。 )
3.垃圾回收机制保证了Java程序不再出现内存溢出
(Java的垃圾回收机制可以有效的防止内存溢出问题,但是它并不能完全保证不会出现内存溢出。例如当程序出现严重的问题时,也可能出现内存溢出问题。)
4.进入dead状态的线程将被垃圾回收器回收。
(进入dead的线程可以恢复,所以gc不会回收)

对于任何一门语言而言,在运行过程中都会创建许多对象,继而需要为这些对象分配内存地址,当这些对象不需要使用的时候,需要释放其占用的内存地址,以供新的对象使用。关于对象内存释放的这一机制就叫做垃圾回收机制(GC)
Java中垃圾回收是自动化的,但其可控性差,内存容易溢出。内存溢出是因为JVM内存分配的对象过多,这些对象所需内存超出了JVM内存大小。虽然Java中是自动的。但是程序员仍可调用System.gc( )来进行手动回收,调用此方法会尝试释放被丢弃的对象占用的内存,但结果无法保证,因此附带一个免责声明。下面我们将从如何确定需要被回收的对象什么时候回收怎样进行回收这三个方面进行分析。

2.确定回收对象

确定回收对象有两个算法:引用计数法可达性分析法
【引用计数法】
简单的来说就是判断对象的引用数量。实现方式:给对象共添加一个引用计数器,每当有引用对他进行引用时,计数器的值就加1,当引用失效,也就是不在执行此对象,它的计数器的值随之减1,若某一个对象的计数器的值为0,那么表示这个对象没有被其他对象引用,也就是意味着是一个失效的垃圾对象,就会被gc进行回收。 但是这种简单的算法在当前的jvm中并没有采用,原因是他并不能解决对象之间循环引用的问题。 假设有A和B两个对象之间互相引用,也就是说A对象中的一个属性是B,B中的一个属性时A,这种情况下由于他们的相互引用,从而垃圾回收机制无法识别。
【可达性分析法】
通过对象的引用链来判断该对象是否需要被回收,通过一系列的GC Roots的对象作为起始点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,就需要回收此对象。
在这里插入图片描述

3. 回收时间

①会在cpu空闲的时候自动进行回收

②在堆内存存储满了之后

③主动调用System.gc()后尝试进行回收

补充:System.gc()用于调用垃圾收集器,在调用时,垃圾收集器将运行以回收未使用的内存空间。它将尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。  所以System.gc()并不能说是完美主动进了垃圾回收。

4.垃圾回收算法的种类

3.1 标记-清除算法

分为两个步骤:
第一就是标记,也就是标记所有的需要回收的对象;
第二就是清理,标记完成后进行统一的回收带有标记的对象占据的内存空间。缺点是效率问题(回收速度慢),还有一个致命的缺点就是空间问题,标记清除之后会产生大量不连续的内存碎片,当程序在运行过程中需要分配较大对象时,无法找到足够的连续内存而造成内存空间浪费。
在这里插入图片描述

4.2 复制算法

复制算法是将内存容量划分为大小相等的两块,每次只使用其中的一块。当一块内存用完之后,就将还存活的对象复制到另一块上面,然后再把已使用的内存空间一次性清理。这样使得每次都对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只是这种算法的代价就是将内存缩小为原来的一半了。

在这里插入图片描述

4.3 标记-整理算法

标记整理算法与标记清除算法很相似,但显著的区别是:标记清除算法仅对不存活的对象进行处理,剩余存活对象不做任何处理,这就造成了内存碎片的问题;而标记整理算法不仅对不存活的对象进行清除,还对存活的对象进行重新整理,因此不会产生内存不连续的现象。
在这里插入图片描述

3.4 分代收集算法

是一种比较智能的算法,也是现在JVM使用最多的一种算法,其实不是一个新的算法,而是在具体的场景自动选择以上三种算法进行垃圾对象回收。
①新生代
新生代的目标就是尽可能快速的收集掉那些生命周期较短的对象,一般情况下新生成的或者朝生夕亡的对象一般都是首先存放在新生代里面。
在这里插入图片描述
新生代将内存按照8:1:1分为一个Eden和so,s1三个区域;大部分对象都在Eden区域生成,在垃圾回收时,先将Eden存活的对象复制到s0区,然后清除Eden区,当这个s0区满了,则将Eden区和s0区的存活对象复制到s1,然后将Eden和s0区清空,此时s0是空的,然后交换s0和s1的角色(即下次回收会扫描eden和s1区),即保持s0为空,如此往复;特别地,当s1不足以存放Eden和s0存放的对象时,则将对象直接放到老年代)
适用回收算法:复制算法
在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成垃圾收集

②老年代

老年代一般存放的是一些生命周期较长的对象,比如在新生代中经历来了n次垃圾回收后仍然存活的对象都进入了老年代。
适用回收算法:标记整理或标记清除
在老年代中因为对象存活率较高,没有额外的空间对它分配担保,就必须使用标记清除或标记整理

③永久代
永久代主要存放静态文件,如java类,方法等,永久代对垃圾回收没有显著影响。
在这里插入图片描述

总结:【1】在新生代中,每次垃圾收集时都有大批对象死去,只有少量存活,那就选用复制算法。只需要付出少量存活对象的复制成本就可以完成收集。【2】老年代中因为对象存活率高、没有额外空间对他进行分配担保,就必须用标记-清除或者标记-整理。
由于永久代经常会内存不够用或者发生内存泄露,JDK1.8开始废弃了永久代,取而代之的是元空间(直接存在内存中可自定义大小),主要存放类的元数据。


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

相关文章

Python垃圾回收机制详解

最近想了解一下Python的内存回收机制,特此来标记一下 平时在写代码的时候,关注的是写出能实现业务逻辑的代码,因为现在计算机的内存也比较宽裕,所以写程序的时候也就没怎么考虑垃圾回收这一方面的知识。俗话说,出来混总…

java垃圾回收机制介绍

一、垃圾回收机制 java中引入了一种独特的内存回收机制解决了过去在c中令人头疼的内存管理问题,使得java程序员在编写程序的时候不必考虑内存的问题。 由于这个机制的存在,java的对象不再有"作用域"的概念,只有对象的引用才有&quo…

java基础:简述垃圾回收机制

1.什么是“垃圾回收”机制? 当程序创建对象,数组等引用类型实体时,系统会在堆内存中为之分配一块内存区,对象就保存在内存区中,当内存不再被任何引用变量引用时,这块内存就变成了垃圾,等待垃圾…

Java的垃圾回收机制介绍

1、java的语言框架 (1)CPU->操作系统内核->应用层框架->JVM(java虚拟机)->Java字节码->Java源代码 (2)java是解释型语言,嵌入式常用的C/C是编译型语言,简单来说:编译型语言只需要编译一次就可以执行&am…

JVM-垃圾回收机制

JVM-垃圾回收机制 引言1、什么是垃圾2、为什么需要GC3、Java中的垃圾回收 垃圾回收相关算法垃圾判断算法标记阶段:引用计数算法标记阶段:可达性分析算法 垃圾清除算法清除阶段:标记-清除算法清除阶段:标记-整理算法清除阶段&#…

Java的垃圾回收机制是什么?

说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。 顾名思义,垃圾回收就是…

GC垃圾回收机制

GC概述 垃圾回收是一种自动的存储管理机制。当一些被占用的内存不再需要时,将其释放,以让出空间,这种存储管理机制,就叫做垃圾回收机制。可以很大程度减轻程序员的负担和错误。 通常在堆(heap) 和 元空间(metaspace)需要GC机制。…

python垃圾回收机制

python垃圾回收机制 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c里用户自己管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄露&a…

Java 垃圾回收机制原理

最近做一个ETL的项目模块,经常由于查询数据量比较大用消息中间件MQ时引起了内存溢出的报错。做完后没事研究了一下JVM和垃圾回收的相关知识点。 一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c程序员最头疼的…

五、垃圾回收机制

一 引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉&…

一、垃圾回收机制

. 一、Java内存结构1、Java堆(Java Heap)2、Java虚拟机栈(Java Virtual Machine Stacks)3、本地方法栈(Native Method Stack)4、方法区(Method Area)5、执行引擎 二、垃圾回收机制1、…

垃圾回收机制浅聊

对于任何一门语言而言,在运行过程中都会创建许多对象,继而需要为这些对象分配内存地址,当这些对象不需要使用的时候,需要释放其占用的内存地址,以供新的对象使用。关于对象内存释放的这一机制就叫做垃圾回收机制&#…

图解Java 垃圾回收机制

摘要: Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区。关于对象分配内存问题,笔者的博文《JVM …

深入理解 Java 垃圾回收机制

一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,java中的额对象不在有“作用域”…

JVM垃圾回收机制

文章目录 JVM垃圾回收机制一、垃圾回收原理二、对象被标记为垃圾方法1. 引用计数器2. 可达性分析 三、垃圾回收算法1. 标记-清除算法2. 复制算法3. 标记-整理算法4. 分代回收算法 JVM垃圾回收机制 一、垃圾回收原理 GC (Garbage Collection:即垃圾回收)的基本原理&#xff1a…

Java垃圾回收(GC)机制

一、为什么要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。 哪些内存需要…

JVM:常用的四种垃圾回收机制

1.CMS (Concurrent Mark Sweep):并行 标记清除 老年代垃圾回收机制 cms是一个基于标记-清除 算法的综合多种算法的老年代垃圾回收器 适用场景:重视服务器响应速度,要求系统停顿时间最短。 这里要说明下,这是一个老年代算法&…

什么是垃圾回收机制(超详细)

垃圾回收机制 1.垃圾回收机制(Garbage Collction)简称GC,是JavaScript中使用的内存管理系统的基本组部分,是为了防止内存泄漏 2.JavaScript是在创建变量(对象、字符串等)时自动进行了分配内存,并…

深入理解JVM—垃圾回收机制

一、前言 明确垃圾收集器关注的部分:堆和方法区。着重学习如何确定哪些垃圾需要回收、垃圾回收算法以及GC触发条件。 二、如何确定哪些垃圾需要回收 1、引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一&…

JavaScript垃圾回收机制

JavaScript垃圾回收机制 1 垃圾为何要产生并回收2 垃圾回收机制2.1 标记清除法2.2 引用计数法 3 V8对垃圾回收机制的优化——分代式垃圾回收机制3.1 新生代与老生代3.2 新生代的垃圾回收3.3 老生代的垃圾回收 1 垃圾为何要产生并回收 当我们写代码时创建一个基本类型、对象、函…