【JVM学习笔记】垃圾回收及算法

揭秘CAS:深入理解与应用解析 在并发编程中,Compare-And-Swap(CAS)机制作为一种无锁算法,凭借其高效性和避免线程阻塞的优势,受到广泛关注。CAS不仅在底层实现上有着重要地位,还在实际开发中发挥着关键作用。本文将从CAS的工作原理、在Java中的实现及其增强机制来回顾和加深理解一下CAS。 阅读详情

如何判定对象为垃圾对象?

        引用计数法

        可达性分析法

如何回收?

        回收的策略:标记-清除算法、复制算法、标记-整理算法、分代收集算法

        垃圾回收器:Serial、Parnew、Cms、G1

何时回收?

 

 

引用计数算法

在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就+1,当引用失效的时候,计数器就-1。不用这种方式,可能会存在对象互相引用的情况,栈内的引用可以清除,但互相引用清楚不掉。

 

运行程序时打印GC日志信息

-verbose:gc 打印简要信息

-xx:+PrintGCDetail 打印详细信息

 

可达性分析法

定义GC Root,通过GCRoot向下搜索,搜索走过的路径称为引用链,当一个对象到GC Root没有任何引用链相连时,则判断该对象是不可用的。

可以作为GCRoot的对象:

1、虚拟机栈

2、方法区的类属性所引用的对象

3、方法区中常量所引用的对象

4、本地方法栈中所引用的对象

 

标记-清除算法

两个过程:一个是标记、一个是清除

效率不高、另外回收后会有大量的不连续空间碎片,这就会导致之后程序需要分配大块连续的内存时,无法找到足够的连续内存而不得不提前进行另一次垃圾回收动作。

 

复制算法

为了解决效率问题,于是就出现了“复制算法”它可以将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。

只是这种算法的代价是将内存缩小为了原来的一半,未免太高了一点。

 

堆的划分:

       新生代:

              Eden 伊甸园

              Survivor 存货去

              Tenured Gen

      老年代

复制算法的优化:

现在的商业虚拟机都采用这种收集算法来回收新生代

新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。

当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。

HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存会被“浪费”。

98%的对象可回收只是一般场景下的数据,没有办法保证每次回收都只有不多于10%的对象存活,当Survivor空间不够用时,需要依赖其他内存(这里指老年代)进行分配担保(Handle Promotion)。

 

标记-整理算法

在标记-清除算法基础上做了改进,主要针对老年代的垃圾回收,标记阶段是相同的标记出所有需要回收的对象,在标记完成之后不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,在移动过程中清理掉可回收的对象,这个过程叫做整理。

标记-整理算法相比标记-清除算法的优点是内存被整理以后不会产生大量不连续内存碎片问题。

复制算法在对象存活率高的情况下就要执行较多的复制操作,效率将会变低,而在对象存活率高的情况下使用标记-整理算法效率会大大提高。

 

分代收集算法

是标记整理算法和复制算法的结合,根据内存中对象的存活周期不同,将内存划分为几块,java的虚拟机中一般把内存划分为新生代和年老代,当新创建对象时一般在新生代中分配内存空间,当新生代垃圾收集器回收几次之后仍然存活的对象会被移动到年老代内存中,当大对象在新生代中无法找到足够的连续内存时也直接在年老代中创建。

 

 

PCIE的MSI中断处理机制与优化策略 PCIe设备的。 阅读详情

相关推荐

DSP28335学习笔记——McBSP配置为SPI

由于28335硬件外设上只有一个SPI接口,所以当SPI接口不够用时,可以将McBSP配置为SPI接口。 参考28335的数据手册,当DSP为主机时,配置McBSP为SPI所用到的接线如下图所示。 另外总结一些调试过程中的经验。 1.传输数据位数的确定 由RCR1寄存器中的RWDLEN1和XCR1寄存器中的XWDLEN1决定。分别对应着接受和发送的位数,在配置成SPI模式的时候,这

捕虫少年 1万+

JVM学习笔记 -- 垃圾回收算法

2、随着对象在Eden区越来越多,如果Eden区满,新创建的对象已经无法放入,就会触发年轻代的GC,称为Minor GC。Minor GC会把需要eden中和From需要回收的对象回收,把没有回收的对象放入To区,每次Minor GC中都会为对象记录他的年龄,初始值为0,每次GC完加1。堆使用效率:不同垃圾回收算法,对堆内存的使用方式是不同的。,复制算法只需要遍历一次存活对象复制到To空间即可,比标记-整理算法少了一次遍历的过程,因而性能较好,但是不如标记-清除算法,因为标记清除算法不需要进行对象的移动。

2501_92127280的博客 578

经典损失函数——均方误差(MSE)和交叉熵误差(CEE)的python实现

损失函数(loss function)用来表示当前的神经网络对训练数据不拟合的程度。这个损失函数有很多,但是一般使用均方误差和交叉熵误差等。 1.均方误差(mean squared error) 先来看一下表达式: 用于将的求导结果变成,是神经网络的输出,是训练数据的标签值,k表示数据的维度。 用python实现: def MS...

Answer3664的博客 1万+

JVM学习笔记——垃圾回收算法

引用计数算法(Reference Counting) 给对象添加一个引用计数器,每当一个地方引用它时,数据器加1;当引用失效时,计数器减1;计数器为0的即可被回收。 优点是实现简单,判断效率高 缺点是很难解决对象之间的相互循环引用(objA.instance = objB; objB.instance = objA)的问题,所以java语言并没有选用引用计数法管理内存 可达性分析算法(GC Roo...

程铭程铭你快成名的博客 3172

C#与海康威视工业相机结合OpenCV与WPF:打造高效的机器视觉应用程序

本文介绍了基于C#、海康威视工业相机SDK和OpenCV的机器视觉应用开发方法。首先配置开发环境,包括海康SDK、OpenCvSharp和WPF项目设置。重点阐述了如何通过SDK初始化相机、获取视频流,并将YUV数据转换为OpenCV可处理的Mat格式进行图像处理(如边缘检测)。同时展示了如何用WPF实现界面交互和实时图像显示。该方案为工业自动化、质量检测等场景提供了高效的技术实现路径,结合了海康相机的高性能采集、OpenCV的强大算法和WPF的交互优势,具有较高的实用价值。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1499

彻底解析 DDIC_TYPE_INCONSISTENCY:从 ABAP ST22 连环 Dump 到 SE14 一键修复

听上去像内核级的致命故障,实则更多源于日常运维的细枝末节。只要掌握的排查三板斧,结合严格的变更流程与周期性的字典体检,再严重的 Dump 也能化险为夷。希望本文的案例与步骤能帮助读者在下一次遇到类似问题时,既能快速止血,也能追根溯源,避免重蹈覆辙。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 629

【JVM 学习笔记 03】:垃圾回收算法和垃圾回收器

【JVM 学习笔记 03】:垃圾回收算法一、新生代的垃圾回收算法:复制算法1.1 复制算法的缺点?1.2 复制算法的优化:Eden区和Survivor区 一、新生代的垃圾回收算法:复制算法 所谓的“复制算法“,把新生代内存划分为两块内存区域,然后只使用其中一块内存 待那块内存快满的时候,就把里面的存活对象一次性转移到另外一块内存区域,保证没有内存碎片 接着一次性回收原来那块内存区域的垃圾对象,再次空出来一块内存区域。两块内存区域就这么重复着循环使用。 1.1 复制算法的缺点? 复制算法的缺点其实非常的明显,

m0_49167443的博客 431

解决开着代理情况下pip或魔搭下载失败

最近由于经常配环境导致,老是要来回切clash关掉代理,非常的不方便如下面的,魔搭模型下载失败如下面的,pip换源后下载失败。

风吹落叶的博客 2950

【JVM】学习笔记2——垃圾回收基本概念与垃圾回收算法

内存区域划分为。

weixin_43825107的博客 365

(秋招复习)一些SLAM基础

秋招复习--SLAM基础知识篇

weixin_45432823的博客 769

labelImg使用教程

Anaconda环境 安装 Anaconda 之后,在开始菜单下找到 Anaconda 文件夹 找到 Anaconda Prompt 点击运行 安装 labelImg pip install labelImg #直接命令行输入 启动 labelImg labelImg #直接命令行输入名称即可 labelImg界面 开始标注 快捷键:W(创建方框),A(上一张),D(下一张) XML文件示例 <annotation> <folder>夜读</folder>

G果的博客 3万+

学习笔记-jvm垃圾回收算法

jvm垃圾回收 如何确定某个对象是垃圾 引用计数法——收回没有被引用的对象 循环引用问题难以解决,比如:(循环结束后,obj视为可回收对象) public static void main(String[] args){ Object object1=new Object(); Object object2=new Object(); object1.object=obje...

jiangjing0623的博客 185

【AI大模型:认知升级】1、全面解析AI大模型:从起源到发展脉络与应用价值

AI大模型是具备超大规模参数(千亿至万亿级)、海量训练数据(TB级)和强迁移学习能力的基础模型。其技术特征包括Transformer架构革新、大数据预训练范式及参数规模超过临界值后的能力涌现。发展历程经历了语言模型突破(2018-2020)、多模态融合(2021-2023)和架构创新(2023至今)三波浪潮,遵循数据、算力、算法协同进化规律。底层驱动因素包括能力涌现机制、算力基础设施突破和应用场景拓展,正在重构产业价值链。通过"知识星系""认知

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2294

JVM学习笔记(五)垃圾回收算法

上篇文章:JVM学习笔记(四)StringTable 概述 什么是垃圾? 垃圾收集。不是Java语言的作生产物。早在1960年。第一门开始使用内存动态分配和拉圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候同收? 如何回收? 什么是垃圾(Garbage)呢? 垃圾是指在运行程序中没有任何指针指向的对象。这个对象就是需要被回收的垃圾 如果不及时对内存中的垃圾进行清理。那么这些垃圾对象所占的内存空间会一直保留到应用程序结束。被保留的空向无法被其他对象使用。甚至可

weixin_46684099的博客 345

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JVM-垃圾回收算法学习笔记

2、垃圾回收算法 1)标记清除 定义:Mark Sweep 速度较快 会产生内存碎片 2)标记整理 Mark Compact 速度慢 没有内存碎片 3)复制 Copy 不会有内存碎片 需要占用两倍内存空间 3、分代垃圾回收 新创建的对象首先分配在 eden 区 新生代空间不足时,触发 minor gc ,eden 区 和 from 区存活的对象使用 - copy 复制到 to 中,存活的对象年龄加一,然后交换 from to minor gc 会引发 stop the world,暂停其他线程,等垃

Eistert 180

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JVM 学习笔记(3) 垃圾回收与垃圾回收算法

垃圾回收与垃圾回收算法 如何确定垃圾 引用计数法 在 Java 中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用, 即他们的引用计数都为 0, 则说明对象不太可能再被用到,那么这个对象就是可回收对象。 引用计数法存在的问题 但是Java并不采用引用计数法,原因如下: jdk从1...

qq_41935644的博客 283

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JVM学习笔记 --- 堆内存、垃圾回收算法、垃圾回收器

一、Java堆内存 这里共介绍四种垃圾回收算法,其中目前较通用使用的是分代回收算法,根据不同的分代对象存活数量,以及空间资源使用不同的算法来回收; JDK 1.7 以及之前为永久代(和元空间为一个东西) JDK 1.8 以及之后为元空间(和永久代为一个东西) JDK 1.7版本对内存如下: JDK1.8版本堆内存如下: 新生代 Yong 新生代又分为 Eden...

杨鑫newlife的专栏 618

JVM学习笔记之垃圾回收相关算法

垃圾回收算法

weixin_47866999的博客 258

JVM学习笔记|垃圾回收相关算法

目录垃圾标记阶段的算法引用计数算法小结可达性分析算法(或根搜索算法、追踪性垃圾收集)GCRoots注意:对象的finalization机制具体过程工具MAT 垃圾标记阶段的算法 对象存活判断 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为已经死亡的对象,GC才会在执行回收时,释放掉其所占用的内存空间,因为这个过程我们可以成为垃圾标记阶段。 那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的

phd961205的博客 347

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

拉圾回收概述 什么是垃圾 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候回收? 如何回收? 垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。 什么是垃圾( Garbage)呢?

fushuai优快云的博客 402

JVM学习笔记3-垃圾回收算法

垃圾回收算法的基础介绍

学习,记录,分享 850

学习笔记-20230607-JVM垃圾回收算法

STW(Stop-the-World)是指垃圾回收器暂停整个应用程序的运行,将JVM内存冻结的一种状态,以便在内存管理系统中执行清理和维护。JAVA所有线程都停止执行,GC线程除外,native方法可以执行,但是不能与JVM交互.GC算法优化的重点就是减少STW,同时也是JVM调优的重点。

一个菜鸟从零基础学JAVA的过程 233

JVM学习笔记2:垃圾回收算法与相关策略

第3章 垃圾收集器和内存分配策略 Garbage Collection的目标是Java堆和方法区,因为这部分内存的分配和回收是动态的,只有在运行时我们才知道这部分会占用多少空间 3.1 对象回收 在Java堆中,当对象不可能再被任何途径使用时,我们可以判断该对象“已死”,垃圾收集器对堆进行回收时先确定对象的状态 3.1.2 引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加一,引用失效时,计数器值减一,当计数器为0时对象不能再被使用 优点:原理简单,判定效率高 缺点:有很多例外情

weixin_45907832的博客 811

jvm学习笔记4----垃圾回收机制与垃圾回收算法

垃圾回收机制与垃圾回收算法-0723 回顾 1.创建对象的过程,重点在于分配内存,两者方式,以及解决并发安全 2.cas加本地内存缓存解决并发安全 3.对象有对象头,设置对象指针,数组必须有记录长度的数据 4.对象头有哈希码、gc、锁标识、线程持有的锁、偏向线程id,偏向时间戳 5.对象的访问,句柄来存,就是中间多了一个指针,hotspot是直接指针,堆里面的指针直接指向数据 6.方法的执行就是栈帧的执行,数据不可能拿到栈中,太大了,所以都是用引用 7.垃圾回收之前必须要判断对象是否在存活,引用计数法无法解

Markland_l的博客 354

JVM学习笔记(五)垃圾回收算法

7. 垃圾回收(Garbage Collect) 7.1 如何确定一个对象是垃圾? 想要进行垃圾回收,要知道垃圾满足什么条件? 7.1.1 引用计数法 对于某个对象而言,只要程序中持有该对象的引用,就说明这个对象不是垃圾,如果该对象没有任何指针对其引用,那它就是垃圾。 弊端:如果AB互相持有引用,会导致永远不能被回收。 7.1.2 可达性分析 通过 GC Root 的对象,开...

分享 AI 编程实战、踩坑经验与技术感悟 | 一个工程师的成长笔记 用代码讲故事,用实战验证理论,用图文让技术更易懂 博客即知识库,分享即成长 🌱 276

JVM学习笔记2:垃圾回收算法及垃圾回收器原理解读及特性对比详解

一、什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导致内存溢出,所以对内存资源的管理是非常重要了。 1.1 C/C++语言的垃圾回收 在C/C++语言中,没有自动垃圾回收机制,是通过new关键字申请内存资源,通过delete关键字释放内存资源。如果,程序员在某些位置没有写delete进行释放,那么申请的对象将一直占用内存资源,最终可能会导致内存溢出。 1.2 Java语言的垃圾回收 为了让程序员更专注于代码的实现,而不用过多的...

Vincent9847的博客 408
上一篇: 【JVM学习笔记】对象的创建
下一篇: 【JVM学习笔记】内存分配
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值