Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法 .

S32K344开发环境搭建全攻略:S32DS 3.5.12与RTD 3.0.0实战指南 在嵌入式开发中,集成开发环境(IDE)与实时驱动(RTD)的协同配置是项目启动的关键。S32DS作为NXP官方IDE,结合RTD包,为S32K3系列提供底层驱动支持。正确安装与路径配置能确保编译、调试与烧录流程顺畅,避免常见错误。该环境适用于汽车电子、工业控制等场景,如车身域控、BMS。本文基于S32K344芯片,详细记录从软件下载到调试的完整过程,帮助开发者快速搭建稳定开发环境。 阅读详情


Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法

标签: Java
1520人阅读 评论(0) 收藏 举报
分类:
Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法


Java GC(Garbage Collection)垃圾回收机制,Java VM中,存在自动内存管理和垃圾清理机制。GC机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,防止出现内存泄露和溢出问题。Java中不能显式分配和注销内存。有些开发者把对象设置为null或者调用System.gc()显式清理内存。设置为null至少没什么坏处,但是调用System.gc()会一定程度上影响系统性能。Java开发人员通常无须直接在程序代码中清理内存,而是由垃圾回收器自动寻找不必要的垃圾对象,并且清理掉它们。


Java GC主要做三件事:
(a)哪些内存需要GC?
(b)何时需要执行GC?
(c)以何策略执行GC?


Java中什么哪些内存需要GC回收?
JVM会分配一个运行时内存空间。包括5大部分:程序计数器(Program Counter Register)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。其中程序计数器、虚拟机栈、本地方法栈是每个线程私有内存空间,随线程而生,随线程而亡。这3个区域内存分配和回收都是确定的,无需考虑内存回收的问题。
但方法区和堆就不同了,一个接口的多个实现类需要的内存可能不一样,只有在程序运行期间才会知道会创建哪些对象,这部分内存的分配和回收都是动态的,GC主要关注的是这部分内存。GC主要进行回收的内存是JVM中的方法区和堆,涉及到多线程(指堆)、多个对该对象不同类型的引用(指方法区),才会涉及GC的回收。
小结:Java GC针对的是JVM中堆和方法区。


Java GC机制启动之前,需要确定堆内存中哪些对象是存活的,一般有两种方法:引用计数法和可达性分析法。
引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。引用计数法实现简单,判定高效,但不能解决对象之间相互引用的问题。
可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。通过称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,搜索路径称为 “引用链(Reference Chain)”,以下对象可作为GC Roots:
(a)本地变量表中引用的对象
(b)方法区中静态变量引用的对象
(c)方法区中常量引用的对象
(d)Native方法引用的对象
当一个对象到 GC Roots 没有任何引用链时,意味着该对象可以被回收。
小结:Java GC垃圾回收机制,回收的是已死的Java对象(引用无法可达)。


Java GC垃圾回收算法


(一)标记 -清除算法
   “标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。之所以说它是最基础的内存回收算法,是因为后续的算法都是基于这种思路、并对其缺点进行改进而得到的。
主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存时候,不得不提前触发另一次垃圾收集动作。


(二)复制算法
“复制”(Copying)内存回收算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半,持续复制长生存期的对象则导致效率降低。


(三)Java GC的分代垃圾回收机制
GC分代回收算法
GC分代的假设:绝大部分对象的生命周期都非常短暂,存活时间短。
“分代回收”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。


GC垃圾回收器会在下面两种情况下启动:
(a)大多数对象会很快变得不可达。
(b)只有很少的由老对象(创建时间较长的对象)指向新生对象的引用。
为强化这一假设,Java虚拟机在物理上划分为两个逻辑内存代——新生代(Young Generation)和老年代(Old Generation)。新生代(Young Generation): 新生代空间用来保存那些第一次被创建的Java对象,分为三个空间:
(a)一个伊甸园空间(Eden )
(b)两个幸存者空间(Survivor )
一共有三个空间,其中包含两个幸存者空间。每个空间的执行顺序如下:
(a)绝大多数刚刚被创建的对象会存放在伊甸园空间。
(b)在伊甸园空间执行了第一次GC之后,存活的对象被移动到其中一个幸存者空间。
(c)此后,在伊甸园空间执行GC之后,存活的对象会被堆积在同一个幸存者空间。
(d)当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。之后会清空已经饱和的那个幸存者空间。
(e)在以上的步骤中重复几次依然存活的对象,就会被移动到老年代。
在新生代中,使用“停止-复制”算法进行内存清理。绝大多数最新被创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可到达,所以很多对象被创建在新生代,然后消失。对象从这个区域消失的过程称为“Minor GC” 。
老年代(Old Generation): 对象没有变得不可达,并且从新生代中存活下来,会被拷贝到这里。其所占用的空间要比新生代多。也正由于其相对较大的空间,发生在老年代上的GC要比新生代少得多。对象如果在年轻代存活了足够长的时间而没有被清理掉(即在几次Young GC后存活了下来),则会被复制到年老代,年老代的空间一般比年轻代大,能存放更多的对象,在年老代上发生的GC次数也比年轻代少。当年老代内存不足时,将执行Major GC,也叫 Full GC。老年代存储的对象比年轻代多得多,而且不乏大对象,对老年代进行内存清理时,如果使用停止-复制算法,则相当低效。一般,老年代用的算法是标记-整理算法,即:标记出仍然存活的对象(存在引用的),将所有存活的对象向一端移动,以保证内存的连续。
小结:Java内存分配和回收机制是:分代分配,分代回收。新生代中,每次垃圾收集时都有大批对象死去,只有少量存活,就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。老年代中,其存活率较高、没有额外空间对它进行分配担保,就应该使用“标记-整理”或“标记-清理”算法进行回收。


Java GC优化永远是最后一项任务。因为Java GC将“Stop the World”(串行GC暂时中断程序执行)。Stop-the-world会在任何一种GC算法中发生。Stop-the-world意味着 JVM 因为要执行GC而停止了应用程序的执行。当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态,直到GC任务完成。GC优化很多时候就是指减少Stop-the-world发生的时间。GC优化的根本原因,垃圾收集器清除Java创建的对象,GC执行的次数,即需要被垃圾收集器清理的对象个数,与创建对象的数量成正比,因此,应该减少创建对象的数量。
GC优化两个目的:
(a)将转移到老年代的对象数量降到最少。对象被创建在伊甸园空间,而后转化到幸存者空间,最终剩余的对象被送到老年代。某些比较大的对象会在被创建在伊甸园空间后,直接转移到老年代空间。老年代空间上的GC处理会比新生代花费更多时间。因此,减少被移到老年代对象的数据可以显著地减少Full GC的频率。减少被移到老年代空间的对象数量,可能被误解为将对象留在新生代。但是,这是不可能的。取而代之,你可以调整新生代空间的大小。
(b)减少Full GC的执行时间。Full GC执行时间比Minor GC要长很多。
AFSim插件开发实战:从环境搭建到功能扩展 本文详细介绍了AFSim插件开发的完整流程,从环境搭建到功能扩展,涵盖了SDK配置、插件创建、核心代码解析、功能扩展实战、调试优化以及高级开发技巧。通过实战案例和实用技巧,帮助开发者快速掌握AFSim插件开发,提升仿真系统的扩展性和灵活性。 阅读详情

相关推荐

VSCode插件全攻略:5分钟搞定Mermaid流程图实时预览(含常见报错解决)

本文提供了一份详细的VSCode插件实战指南,帮助开发者快速配置Mermaid流程图实时预览环境。文章涵盖核心插件选择、高效工作流搭建,并重点解决了图表渲染失败、样式异常等常见报错问题,旨在提升技术文档的编写效率与可视化质量。

rust6ferris的博客 1484

JVM——GC算法原理

本文将介绍JVM垃圾回收算法相关原理。垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?

庄小焱 1416

量子密钥分发系统的工程实践(四):FPGA在后处理中的核心实现与优化

本文深入探讨了FPGA在量子密钥分发(QKD)系统后处理中的核心实现与优化策略。文章详细拆解了FPGA如何高效完成原始密钥提取、误码协商和私密放大等关键任务,并分享了流水线设计、资源复用及存储器架构优化等工程实践“心法”,旨在解决高速、实时QKD系统中的性能瓶颈,提升密钥生成率。

t8u9v0的博客 387

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法Java GC(Garbage Collection)垃圾回收机制,Java VM中,存在自动内存管理和垃圾清理机制。GC机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,

Zhang Phil 2万+

U型槽微带贴片天线:从理论公式到带宽扩展实战

本文深入探讨了U型槽微带贴片天线的设计与带宽扩展实战。针对传统微带天线带宽窄的痛点,详细解析了通过引入U型槽形成双谐振点以拓宽带宽的原理,并提供了从MATLAB理论计算、ANSYS HFSS仿真建模到参数优化的一站式工程指南。文章还分享了多种带宽扩展组合技巧及仿真与实测避坑经验,助力射频工程师设计出高性能的宽带微带天线。

weixin_29168153的博客 444

Android系统去掉长按webview界面弹框中的分享功能

Android 系统去解决长按显示内容,去掉分享功能,不论那个界面,是所有界面都需要满足。如果仅仅去掉系统自带的,那么系统来处理如果客户自定义,部分App自定义的菜单项,不是调用系统的,那么还是需要应用去解决的。之前做过Editext,其实还需要去TextView,最难点的就是WebView中的HTML了 去分享功能了。WebView中涉及到分享功能菜单的界面,/***//***//***//***//***//***//***//***//**

十年饮冰,难凉热血 1016

【Java基础】浅谈垃圾回收

在Java程序的生命周期中,Java运行环境提供了一个系统的垃圾回收器线程,负责自动回收那些没有被引用的对象所占用的内存,这种清除无用对象进行内存回收的过程就叫作垃圾回收 (garbage collection)。Java提供自动内存回收的功能,可以让程序员减轻许多内存管理的负担,同时也减少犯错的机会。

汤姆lazy的优快云博客 681

《YOLOv8:从入门到实战》报错解决 & 专栏答疑

《YOLOv8:从入门到实战》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇专栏答疑,针对同学们在学习过程中所提出的问题进行汇总记录,并不断实时更新,希望能够帮助到大家!🌈

小哥谈 1240

java 强制进行垃圾收集_java – 在Clojure中强制垃圾收集是个好主意吗?

我有一个Clojure程序在运行时消耗了大量的堆(我曾经在2.8GiB附近测量它),我正试图找到一种方法来减少它的内存占用.我目前的计划是经常强制进行垃圾收集,但我想知道这是不是一个好主意.我已经阅读了How to force garbage collection in Java?和Can I Force Garbage Collection in Java?,并了解如何操作 – 只需调用(Sys...

weixin_32969997的博客 200

【华为OD机试真题】7、字符串筛选排序 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >输入一个由N个大小写字母组成的字符串 按照ASCII码值从小到大进行排序 查找字符串中第K个最小ASCII码值的字母(k>=1) 输出该字母所在字符串中的位置索引(字符串的第一个位置索引为0) k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引 如果有重复字母则输出字母的最小位置索引

KJ.JK 2266

第4节:cesium 0基础发布离线地图(含源码+视频)

cesium发布离线地图

qq_29384639的博客 1594

java GC原理及算法

在 很多人看来,java中内存的动态分配与内存回收已经不用用户担心了,因为它给我们提供了GC自动回收 ,感觉一切都进入了自动化了,但是对于各种内存溢出,内存泄漏问题的出现,我们还是很有必要学习GC的。地球人都知道,Java有个东西叫垃圾收集器,它 让创建的对象不需要像C/C++那样delete、free掉,但你能不能谈谈,GC是在什么时候,对什么东西,做了什么事情?”  如果还不是很了解那我们一起

lantian0802的专栏 1306

2026年华为OD机试真题 新系统【点亮战争迷雾】

华为OD机试真题 8月18号 新系统【点亮战争迷雾】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【点亮战争迷雾】多语言题解。

qq_45776114的博客 491

java gc 回收_Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法Java GC(Garbage Collection)垃圾回收机制,Java VM中,存在自动内存管理和垃圾清理机制。GC机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,...

weixin_42362885的博客 260

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java学习笔记15:垃圾回收机制(Garbage Collection)、垃圾回收原理和算法、通用的分代垃圾回收机制、JVM调优和Full GC、开发中容易造成内存泄露的操作

一、垃圾回收机制介绍 java引入了垃圾回收机制,另C++程序员最头疼的内存管理问题迎刃而解。java程序员可以将更多的精力放到业务逻辑上而不是内存管理工作上,大大的提高了开发效率。 二、垃圾回收原理和算法 1、内存管理   java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放;   对象空间的分配:使用new关键字创建对象即可;   对象空间的释放:将对象赋值null即可。...

任性的生鱼片 的博客 806

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JVM垃圾回收机制 (垃圾判断,垃圾回收算法,垃圾回收器,五种引用)【jvm】

????‍????博主主页:爪哇贡尘拾Miraitow ????传作时间:????2022年1月9日 晚21:44???????? ????内容介绍:最近在学习JVM所以会时不时更新有关内容 ????参考资料:黑马JVM 度娘 ????参考链接:????JVM垃圾回收机制 ⏳简言以励:列位看官,且将新火试新茶,诗酒趁年华 ????内容较多有问题希望能够不吝赐教???? ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? ????JVM垃圾回收 ♻1.1 如何判断对象可以回收♻1、 引用计数器法2、可达

qq_46489085的博客 4063

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java虚拟机(Java Virtual Machine,JVM)与垃圾回收机制(Garbage Collection,GC)

Java 虚拟机(Java Virtual Machine, JVM)是运行 Java 字节码的虚拟机。它是Java平台的核心组件之一,使得Java程序具有的特性。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言 一次编写,到处运行 的关键所在。

锟斤拷 3127

【Java】Garbage Collection-垃圾回收

概念   垃圾回收(Garbage Collection)是一种自动的存储器管理机制,可以减轻程序员管理内存的负担,减少程序员犯错的机会。垃圾回收最早源于LISP语言,而非Java的伴生产物。Java与C/C++语言对于内存的管理,用钱钟书先生的《围城》描述非常形象:外面的人想进来,里面的人想出去。   垃圾回收主要需要解决三个问题: 什么地方的垃圾需要回收 什么时间回收 使用...

Just do it! 1429

Java的GC(Garbage Collection,垃圾回收)

Java的GC(Garbage Collection,垃圾回收)机制是Java虚拟机(JVM)中的一个重要功能,用于自动管理堆内存中不再使用的对象,释放其占用的内存空间,以避免内存泄漏和溢出。

2401_83447580的博客 846

JVM 的 GC(Garbage Collection,垃圾收集)

在 JVM 中,“垃圾”指的是已经不再被任何引用链访问到的对象,也就是程序中无法再访问到的“无用对象”。判断垃圾:通过可达性分析,找出不可达对象标记存活对象:从 GC Roots 开始遍历清理内存:根据算法(复制、标记-清除、标记-整理)回收垃圾分代收集:新生代用复制算法,老年代用标记-整理选择收集器:根据应用需求选择合适的 GC(如 G1 适合大堆低延迟)监控调优:通过日志和工具分析 GC 行为,优化参数💡一句话总结。

qq_61723836的博客 955

JVM垃圾回收(Garbage Collection)机制

Java的垃圾回收(Garbage Collection,GC)机制是Java虚拟机(JVM)的一项关键功能,旨在自动管理内存,回收不再使用的对象,保证程序运行过程中不出现内存泄漏和内存溢出。

weixin_44711513的博客 1172

JVM GC算法原理与优化

在深入探讨Java虚拟机(JVM)的垃圾回收(GC)算法之前,让我们先设想一个场景:一个大型企业级应用,它每天处理着数以亿计的用户数据。随着业务量的不断增长,系统内存逐渐被大量无用的对象占据,导致频繁的内存溢出错误,严重影响了系统的稳定性和性能。这种情况下,垃圾回收算法的重要性不言而喻。垃圾回收算法是JVM中一个核心的知识点,它负责自动回收不再使用的对象占用的内存,从而避免内存泄漏和溢出问题。在Java应用中,内存管理是一项至关重要的任务,而GC算法正是实现这一任务的关键技术。

我是Java程序员廖志伟,感谢朋友们的支持! 1249

Java:JVM调优之垃圾回收(Garbage Collection)

关于jvm垃圾回收我们要了解的无非以下几点: 为什么要垃圾回收? 如何确定某个对象是垃圾? 1、引用计数法 2、可达性分析算法 3、Java中的引用类型 常用的垃圾收集算法 1、标记-清除(Mark-Sweep)算法 2、复制(Copying)算法 3、标记-整理(Mark-Compact)算法 4、分代收集算法 常见的垃圾收集器 垃圾回收是什么时候触发的 Minor G...

Jodness' Blogs 836

Java语言的垃圾回收(Garbage Collection)

垃圾回收是一个自动释放不再被程序使用的对象所占内存的过程。简单来说,垃圾回收的目的是找出那些不再需要的对象,并将其占用的内存释放回内存池,以供后续的内存分配使用。在Java中,GC 是由 Java 虚拟机(JVM)负责管理的,程序员无需手动管理内存。通过这种方式,Java 提供了更高的安全性,并减少了因内存管理不当而引起的错误。Java的垃圾回收机制有效地解决了内存管理的问题,使开发人员能够更专注于业务逻辑的实现而不是内存的使用。

2401_90032265的博客 959

15 垃圾回收机制(Garbage Collection)

对15 垃圾回收机制(Garbage Collection)的介绍。

小安的博客 1018
上一篇: 图像和流媒体 -- 帧率、分辨率、码流的概念和关系
下一篇: Java的内存回收机制
Java_2017_csdn
博客等级 码龄10年 329粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值