GC的算法与种类

Jvm中GC种类和算法 1.什么是GC GC(GarbageCollection)是垃圾回收机制,在Java中开发人员无法使用指针来自由的管理内存,GC是JVM对内存(实际上就是对象)进行管理的方式。GC使得Java开发人员摆脱了繁琐的内存管理工作,让程序的开发更有效率。 2. GC基本原理 Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。   对于程序员来说,分配对象使用new关 阅读详情

GC的算法与种类

引用计数法

引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,则对象A就不可能再被使用。
这里写图片描述
【注】名词解释
可达对象:通过根对象进行引用搜索,最终可以到达的对象
不可达对象:通过根对象进行引用搜索,最终没有被引用到的对象

引用计数法的问题

引用和去引用伴随加法和减法,影响性能
很难处理循环引用
这里写图片描述
如图循环引用因为引用计数不为0,所以永远不会被GC。

标记-清除

标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。
这里写图片描述
标记清除存在一个问题,多次标记清楚过后容易形成过多的内存碎片

标记-压缩

标记-压缩算法适合用于存活对象较多的场合,如老年代。它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。
这里写图片描述
这种方式避免的内存碎片的产生

复制算法

复制算法将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。
这里写图片描述
与标记-清除算法相比,复制算法是一种相对高效的回收方法,但是复制算法需要多一倍的内存。

复制算法比较适用于新生代。因为在新生代,垃圾队形通常会多于存货对象,复制算法的效果会比价好。不适用于存活对象较多的场合如老年代。why?思考下

分代思想

对于复制、标记清除、标记压缩等GC算法各自都有优势和缺陷,在所有的算法中没有一种算法能够替代其他算法。因此根据垃圾回收对象的特性,使用合适的算法回收,才是明智的选择。

分代算法就是这种思想,它将内存区间根据对象的特点分成几块,根据每块内存区间的特点,使用不同的回收算法,以提高垃圾回收的效率。

通常情况下JVM虚拟机的堆分为新生代和老年代。新生代的特点是对象存活时间一般不长,大约90%的新建对象会被很快回收,因此,新生代比较适合使用复制算法。当一个对象经过几次回收之后依然存活,对象就会被放入老年代的内存空间。在老年代中,几乎所有对象都是经过几次GC之后依然得以存活的。因此,可以任务这些对象,在一定时期内,甚至在应用程序的整个生命周期中,将是常驻内存的。所以使用标记清除或者标记压缩算法比较合适。

分区思想

分带算法按照对象的生命周期长短划分为两个部分,分区算法将整个堆空间划分成连续的不同小区间,每个小区间独立使用独立回收。这种算法的好处是可以控制一次回收多少个区间。这样可以让GC导致停顿时间拆短,如此GC多次每次时间变短。

谁才是真正的垃圾——判断可触及性

所有的算法,需要能够识别一个垃圾对象,因此需要给出一个可触及性的定义:即从根节点开始是否可以访问到这个对象,如果可以,则说明当前对象正在被使用,如果从所有的根节点都无法访问到某个对象,说明对象已经不再使用了,一般来说,此对象需要被回收。

简单来说可触及性包括以下3种状态:
可触及的:从根节点可以开始,可以到达这个对象。
可复活的:对象的所有引用被释放,不过finalize()函数没有被调用,可能在finalize()函数中复活。
不可触及的:对象的finalize()函数被调用,并且没有复活。
以上三种状态只有对象在不可触及时才可以被回收。

【注:根节点】
栈中引用的对象
方法区中静态成员或者常量引用的对象(全局对象)
JNI方法栈中引用对象

【注:finalize】
- finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
- finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性
- 不建议用finalize方法完成“非内存资源”的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象);②作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。其原因可见下文[finalize的问题]
但是finalize()依然是一个糟糕的模式,不推荐使用,因为finalize()可能发生引用外泄,无意中复活对象。更为重要的是finalize()是系统调用的,调用时间不明确,而try-catch-finally完全可以有更加好的效果。
参考finalize方法总结

对象的复活

举个例子:
这里写图片描述
这里写图片描述

引用的强弱

java中提供4个级别的引用:强引用、软引用、弱引用和虚引用
这里略过了….

Stop-The-World

Java中一种全局暂停的现象
全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互
多半由于GC引起
1. Dump线程
2. 死锁检查
3. 堆Dump
危害
长时间服务停止,没有响应
遇到HA系统,可能引起主备切换,严重危害生产环境。

最新版 Akamai 逆向 风控破解 经过测试,捷星 jetstar.com,德州仪器 ti.com,w6 wizzair.com,还有一些航空公司的都是可以实现一个并发的有需要的可以。 阅读详情

相关推荐

学术报告系列(二) - 智能自主作业机器人感知与控制技术及发展趋势

收集整理于2022年模式识别高峰论坛湖南大学王耀南院士报告(报名题目:智能自主作业机器人感知与控制技术及发展趋势)

Make something people want. 4696

GC种类和GC算法种类精简梳理

主要有五种GC: 1.Serial GC Serial体现在工作是单线程的,精简,但是垃圾收集时会进入"stop-the-world"状态。是JDK8中client模式下默认GC。新生代的Serial GC采用复制算法,老年代的Serial GC采用标记-整理算法,由于区别算法不同,老年代的Serial GC专称Serial Old。 -XX:+UseSerialGC 2.ParNew G...

白白胖胖充满希望 3708

S32K344 Bootloader实战:一个按键实现从Boot到App的无缝跳转(附完整代码)

本文详细介绍了基于NXP S32K344微控制器的Bootloader开发实战,重点解析如何通过一个硬件按键实现从Boot到App的可靠跳转。内容涵盖内存分区规划、中断向量表重映射、外设初始状态管理等核心要素,并提供了完整的代码示例和调试技巧,适用于汽车电子和工业控制等高可靠性应用场景。

weixin_29192365的博客 307

【JVM】一文搞懂常见GC算法

GC目的程序运行过程中可能会产生许多垃圾对象,持续占用内存会造成内存泄漏,最终可能导致内存溢出,迫使系统中断运行。首先需要搞懂内存泄漏和内存溢出的概念!!!内存泄漏(memoryleak)是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出。内存溢出(outofmemory)。)。)。内存效率。。.........

fearless的博客 6030

TI C2000 , .cmd文件,.TI.ramfunc,将程序分配为在RAM中运行/Flash运行的配置方法和原理讲解,(如28375S ,280049,28335等等芯片)

1 基础知识讲解 1.1 在RAM中运行还是在flash中运行指的是什么? 1.1.1 背景:程序编译完之后生成的.bin文件,.bin文件中包含代码段,代码段中全是汇编指令,而汇编指令中包含多个函数,各函数头的地址不同,如存在A函数和B函数,假设RAM地址区间是0x0000-0x8000,flash的地址区间是0xA000-0xF000,A函数要调用B函数,则A函数调用B函数的那段汇编指令中包含的是B函数头的存储地址,A函数和B函数都在flash中有存储 1.1.2 情况1:B函数是配置为在RAM中运行,

weixin_43776284的博客 8063

GEE影像重采样实战:从10米到500米,如何用.reduceResolution和.reproject统一尺度?

本文详细介绍了在Google Earth Engine (GEE)平台中,如何利用`.reduceResolution()`和`.reproject()`方法解决多源遥感影像的尺度统一难题。通过实战案例,从哨兵2号10米分辨率影像聚合至MODIS 500米尺度,阐述了聚合规则选择、参数配置及效果验证的全流程,为环境监测、农业分析等领域的跨尺度数据融合提供了关键方法。

weixin_29223603的博客 84

GC(四种类型的垃圾回收器)

GC分为四种: 1.串行垃圾回收器(Serial Garbage Collector) 2.并行垃圾回收器(Parallel Garbage Collector) 3.并发标记扫描垃圾回收器(CMS Garbage Collector) 4.G1垃圾回收器(G1 Garbage Collector) &nbs...

别抢我蓝buff 1546

SIwave串扰分析保姆级教程:从Allegro文件导入到结果解读,手把手教你排查PCB信号问题

本文提供SIwave串扰分析的详细教程,从Allegro文件导入到结果解读,手把手教你排查PCB信号问题。涵盖环境准备、参数配置、串扰扫描技巧及实战案例,帮助工程师精准定位和解决高速PCB设计中的串扰问题,提升信号完整性分析能力。

weixin_42620913的博客 255

【性能测试】三种基本的GC算法

内存中的对象构成一棵树,当有效的内存被耗尽的时候,程序就会停止,做两件事,第一:标记,标记从树根可达的对象(途中水红色),第二:清除(清楚不可达的对象)。标记清除的时候有停止程序运行,如果不停止,此时如果存在新产生的对象,这个对象是树根可达的,但是没有被标记(标记已经完成了),会清除掉。 缺点:递归效率低性能低;释放空间不连续容易导致内存碎片;会停止整个程序运行;

m0_49428126的博客 1153

Altium Designer(AD)PCB拼版——两种方法教程

本文详细介绍了PCB拼版的设计要点与操作方法。主要内容包括:拼版目的(解决小尺寸夹持问题、提高利用率、降低成本)和三大连接方式(V-CUT、邮票孔、空心连接条)的特点与参数设置;工艺边设计规范(宽度、定位孔、Mark点等要求);拼版尺寸限制与常见错误检查;以及两种具体拼版操作方法(特殊粘贴和拼版阵列),并附有工艺边、定位孔、Mark点的绘制步骤示意图。同时提供了硬件工程师笔试面试相关资源链接。全文系统阐述了PCB拼版的核心技术和操作流程,为电子设计人员提供了实用指导。

XU157303764的博客 7593

【系统架构设计师-2026上半年真题】综合知识-参考答案及详解(75题完全回忆版)

【系统架构设计师-2026上半年真题】综合知识-参考答案及详解(75题完全回忆版)

数据知道的博客 3100

GC算法与种类

今天跟着一篇优快云的blog学习GC 垃圾回收器机制是由Garbage Collection来实现的。GC是后台的守护进程,它是低优先级进程,但是根据内存的使用情况动态的调整它的优先级,因此,它是内存低到一定程度的时候才会自动运行,所以回收时间不确定。 GC处理的数据主要在运行时数据区域的堆中(所有对象化的实例都在这里),当一个对象不再被引用时,就会回收这个引用 下面为GC算法: 引用计数法 简...

RikkaTheWorld 863

Dify平台隐患url:/console/api/remote-files/upload暴露高危漏洞,配置nginx htpasswd模块认证机制屏蔽解决

内部网络探测: 攻击者可通过SSRF扫描内网服务云元数据访问: 可能访问AWS/Aliyun/腾讯云等元数据服务服务端请求伪造: 以服务器身份发起任意HTTP请求。

CN_Eden 1317

GC 算法与种类

相同点(1)三个算法都基于根搜索算法去判断一个对象是否应该被回收,而支撑根搜索算法可以正常工作的理论依据,就是语法中变量作用域的相关内容。(2)在GC线程开启时,或者说GC过程开始时,它们都要暂停应用程序(stop the world)。区别三种算法比较:效率:复制算法>标记-整理算法>标记-清除算法;内存整齐度:复制算法=标记-整理算法>标记-清除算法内存利用率:标记-整理算法=标记-清除算法>复制算法。

java领域分享 3110

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【JAVA秒会技术之玩搞定GC】GC算法与种类

GC算法与种类 (一)GC的概念         GC,指Ganbage Collection 垃圾回收器。GC的算法主要分为四类:引用计数法、标记清除、标记压缩、复制算法。下面将对这几种算法进行逐一说明。 (二)GC的算法——引用计数法     引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数

qq296398300的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

GC算法和种类

1.GC的概念 Garbage Collection垃圾收集 Java中,GC对象时堆空间和永久区 2.Garbage Collection算法 ①引用计数法 通过引用计算来回收垃圾 原理:对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1,只要对象A的引用计数器的值为0,则对象A就不可能再被使用,可以进行回收了。 上述从根对象(Gc...

huangwei18351的博客 2335

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jvmGC算法和GC种类

Parallel GC是一种多线程的垃圾回收器,它使用复制算法来回收新生代,使用标记-整理算法来回收老年代。Parallel GC适用于多核CPU和大内存的环境,它的优点是回收效率高,缺点是会占用较多的CPU资源。Serial GC是一种单线程的垃圾回收器,它使用复制算法来回收新生代,使用标记-整理算法来回收老年代。分代算法是根据对象的存活周期将堆内存划分为不同的区域,然后根据不同区域的特点使用不同的垃圾回收算法。Shenandoah GC是一种低停顿时间的垃圾回收器,它使用标记-清除算法来回收堆内存。

互联网知识分享 245
上一篇: (4)Bean的加载
下一篇: 垃圾收集器与内存分配
sicofield
博客等级 码龄18年 169粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值