jvm优化——图解垃圾回收,看不懂你打我

Java工程师必备:JVM原理、内存模型、调优、垃圾回收机制、面试题 在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱。 通过调研一线互联网大厂的招聘JD,小编对标C站能力认证要求,为大家整理了系列技术干货合集,助力小伙伴们顺利进大厂~ 小编根据C4认证的成长路径整理了Java的相关资源,从零基础带你进入Java的世界。 欢迎大家扫描文末二维码,一起学习~ 一、JVM原理 【JVM原理最全、清晰、通俗讲解,五天40小时吐血整理】 【JVM工作原理】 【初探JVM原理与结构】 【JVM原理和. 阅读详情

对于调优之前,我们必须要了解其运行原理,java 的垃圾收集Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。因此本篇主要从这三个方面来了解:

1. 哪些对象需要被回收?

2. 什么时候回收?

3. 如何回收?

 

一、谁要被回收

java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自各自的用途。主要包含以下几个部分组成:

jvm优化——图解垃圾回收,看不懂你打我

 

jvm优化——图解垃圾回收,看不懂你打我

 

 

1、程序计数器

程序计数器占用的内存空间我们可以忽略不计,它是每个线程所执行的字节码的行号指示器。

2、虚拟机栈

java的虚拟机栈是线程私有的,生命周期和线程相同。它描述的是方法执行的内存模型。同时用于存储局部变量、操作数栈、动态链接、方法出口等。

3、本地方法栈

本地方法栈,类似虚拟机栈,它调用的是是native方法。

4、堆

堆是jvm中管理内存中最大一块。它是被共享,存放对象实例。也被称为“gc堆”。垃圾回收的主要管理区域

5、方法区

方法区也是共享的内存区域。它主要存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(jit)编译后的代码数据。

以上就是jvm在运行时期主要的内存组成,我们看到常见的内存使用不但存在于堆中,还会存在于其他区域,虽然堆的管理对程序的管理至关重要,但我们不能只局限于这一个区域,特别是当出现内存泄露的时候,我们除了要排查堆内存的情况,还得考虑虚拟机栈的以及方法区域的情况。

知道了要对谁以及哪些区域进行内存管理,我还需要知道什么时候对这些区域进行垃圾回收。

 

二、什么时候回收

 

在垃圾回收之前,我们必须确定的一件事就是对象是否存活?这就牵扯到了判断对象是否存活的算法了。

引用计数算法:

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器+1,当引用失效,计数器-1.任何时刻计数器为0的对象就是不可能再被使用的。

优点:实现简单,判定效率高效,被actionscript3和python中广泛应用。

缺点:无法解决对象之间的相互引用问题。java没有采纳

可达性分析算法:

通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GCRoots没有任何引用链相连的时候,则证明此对象是不可用的。

比如如下,右侧的对象是到GCRoot时不可达的,可以判定为可回收对象。

jvm优化——图解垃圾回收,看不懂你打我

在java中,可以作为GCRoot的对象包括以下几种:

* 虚拟机栈中引用的对象。

* 方法区中静态属性引用的对象。

* 方法区中常量引用的对象。

* 本地方法中JNI引用的对象。

基于以上,我们可以知道,当当前对象到GCRoot中不可达时候,即会满足被垃圾回收的可能。

那么是不是这些对象就非死不可,也不一定,此时只能宣判他们存在于一种“缓刑”的阶段,要真正的宣告一个对象死亡。至少要经历两次标记:

第一次:对象可达性分析之后,发现没有与GCRoots相连接,此时会被第一次标记并筛选。

第二次:对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,此时会被认定为没必要执行。

 

三、如何回收

 

上述的两点讲解之后,我们大概明白了,哪些对象会被回收,以及回收的依据是什么,但回收的这个工作实现起来并不简单,首先它需要扫描所有的对象,鉴别谁能够被回收,其次在扫描期间需要 ”stop the world“ 对象能被冻结,不然你刚扫描,他的引用信息有变化,你就等于白做了。

 

分代回收

我们从一个object1来说明其在分代垃圾回收算法中的回收轨迹。

 

1、object1新建,出生于新生代的Eden区域。

jvm优化——图解垃圾回收,看不懂你打我

 

2、minor GC,object1 还存活,移动到Fromsuvivor空间,此时还在新生代。

jvm优化——图解垃圾回收,看不懂你打我

 

3、minor GC,object1 仍然存活,此时会通过复制算法,将object1移动到ToSuv区域,此时object1的年龄age+1。

jvm优化——图解垃圾回收,看不懂你打我

 

4、minor GC,object1 仍然存活,此时survivor中和object1同龄的对象并没有达到survivor的一半,所以此时通过复制算法,将fromSuv和Tosuv 区域进行互换,存活的对象被移动到了Tosuv。

jvm优化——图解垃圾回收,看不懂你打我

 

5、minor GC,object1 仍然存活,此时survivor中和object1同龄的对象已经达到survivor的一半以上(toSuv的区域已经满了),object1被移动到了老年代区域。

jvm优化——图解垃圾回收,看不懂你打我

 

6、object1存活一段时间后,发现此时object1不可达GcRoots,而且此时老年代空间比率已经超过了阈值,触发了majorGC(也可以认为是fullGC,但具体需要垃圾收集器来联系),此时object1被回收了。fullGC会触发 stop the world。

jvm优化——图解垃圾回收,看不懂你打我

 

 

在以上的新生代中,我们有提到对象的age,对象存活于survivor状态下,不会立即晋升为老生代对象,以避免给老生代造成过大的影响,它们必须要满足以下条件才可以晋升:

1、minor gc 之后,存活于survivor 区域的对象的age会+1,当超过(默认)15的时候,转移到老年代。

2、动态对象,如果survivor空间中相同年龄所有的对象大小的总和大于survivor空间的一半,年级大于或等于该年级的对象就可以直接进入老年代。

以上采用分代垃圾收集的思想,对一个对象从存活到死亡所经历的历程。期间,在新生代的时刻,会用到复制算法,在老年代时,有可能会用到标记-清楚算法(mark-sweep)算法或者标记-整理算法,这些都是垃圾回收算法基于不同区域的实现,我们看下这几种回收算法的实现原理。

 

垃圾回收算法

 

标记清除法(Mark-Sweep)

标记清除法是垃圾回收算法的思想基础。标记清除算法将垃圾分为两个阶段:标记阶段和清除阶段。

标记阶段,通过根节点,标记所有从根节点开始的可达对象,未标记过的对象就是未被引用的垃圾对象。

清除阶段,清除所有未被标记的对象。

jvm优化——图解垃圾回收,看不懂你打我

 

 

复制算法(Copying)

复制算法是,将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在适用的内存中存活对象复制到未使用的内存块,然后清除使用的内存块中所有的对象。

jvm优化——图解垃圾回收,看不懂你打我

 

 

标记压缩算法(Mark-Compact)

jvm优化——图解垃圾回收,看不懂你打我

 

标记压缩算法是一种老年代的回收算法。

标记阶段和标记清除算法一致,对可达对象做一次标记。

清理阶段,为了避免内存碎片产生,将所有的存活对象压缩到内存的一端。

 

四、垃圾收集器

垃圾收集器是内存回收的具体实现,不同的厂商提供的垃圾收集器有很大的差别,一般的垃圾收集器都会作用于不同的分代,需要搭配使用。以下是各种垃圾收集器的组合方式:

jvm优化——图解垃圾回收,看不懂你打我

 

jvm优化——图解垃圾回收,看不懂你打我

JVM内存结构图解 一 真实系统中的概念   JVM(Java Virtual Machine),顾名思义是对真实计算机系统的模拟,正因如此才能屏蔽物理机器的变化,从而实现“一次编译,到处运行”。   相信很多Java程序员经常听到堆、栈等概念,也会进行设置调优以让Java应用能够更好地运行,但对于JVM与真实计算机系统之间的关系并没有特别清晰的认识。因此,这里先简单介绍下真实计算机系统中的一 阅读详情

相关推荐

一堵隔墙砌在哪:NewRatio的真实语义、收集器差异与按存活曲线定容新生代解析

NewRatio是老年代与新生代之比,新生代等于堆除以NewRatio加一,只能取整数。本文结合JDK8与17源码和实测说明:-Xmn优先于它;CMS未显式设置时按GC线程数定容,4核4GB堆仅给332.8MB;G1显式设置会关闭停顿目标伸缩;ZGC不读取它。文章把蓄水池模型补成可计算的账:Young GC间隔取决于Eden与分配速率,晋升量取决于存活曲线与Survivor,老年代须容纳常驻数据并留出最坏晋升余量。实验显示Parallel最优点紧贴连环Full GC悬崖,CMS则平缓地下降。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

JVM(三)图解垃圾回收

当问到垃圾回收的时候该怎么去回答?为什么那么多面试官喜欢从如何判断对象应该被回收开始问? Java和C++之间永远隔着一道由自动内存管理和自动垃圾回收筑起来的高墙,里面的人想出去,外面的人想进来。——《深入理解Java虚拟机》 Java语言是一门自动进行垃圾回收的语言 垃圾回收(GC) 指的是:对象在使用完毕之后,在应用系统之后的运行过程中,不会再使用到这个对象,那么这个对象就应该被回收掉,让出它所占用的内存空间给将要被创建的对象。 在一个应用系统中,创建对象的动作时时刻刻都在发生,每一次查询,每一次请求

XiaoA82的博客 727

本地AI助手部署指南:DeepSeek Harness与Ollama集成实践

AI Agent作为当前人工智能领域的热门技术,通过模拟人类决策过程,能够自主规划、调用工具并执行复杂任务。其核心原理在于将大语言模型的推理能力与外部工具API相结合,形成可闭环的工作流。这种技术架构的价值在于显著提升了AI系统的实用性和自动化水平,使其从单纯的对话工具转变为能够解决实际问题的智能助手。在应用场景上,AI Agent广泛应用于代码生成、数据分析、自动化办公等领域。本文聚焦于如何通过DeepSeek Harness平台与Ollama本地模型的集成,实现隐私安全、离线可用的AI助手部署方案,特别

dengjuanshou7445的博客 474

图文详细讲解·jvm垃圾回收全过程及垃圾回收算法

垃圾回收什么是垃圾如何定位垃圾(1)引用计数(2)根可达算法常见垃圾回收算法标记清除(mark-sweap)拷贝(copy)标记压缩(mark-compact)jvm分代模型(仅用于分代垃圾回收算法)堆内存逻辑分区常见垃圾回收器serialserial oldParallel ScavengeParallel OldparNewCMS #小白话 什么是垃圾 没有引用指向的任何对象 如何定位垃圾...

qq_41732995的博客 1814

详解在linux上安装vpn客户端

详解在linux上安装vpn客户端

FuncPlotCalc 8427

【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程【站长亲测】

MMORPG端游【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程。

百创科技 531

一篇文章彻底搞懂GC

文章目录前言1. JVM内存区域2. GC概述2.1 哪些对象需要回收2.1.1 引用计数算法2.1.2 可达性分析算法2.2 如何回收2.3 何时回收3. GC回收算法3.1 分代收集理论3.1.1 强分代假说3.1.2 弱分代假说3.1.3 跨代引用假说3.2 标记清除3.3 标记复制3.4 标记整理4. 垃圾收集器4.1 Serial4.2 Parallel4.3 CMS4.4 G14.5 面向未来的ZGC5. GC的调优 前言 1. JVM内存区域 GC的主要作用区域 2. GC概述 GC要完成

程序员小潘 3573

17、扩展景深成像的瞳孔函数工程技术解析

本文详细解析了扩展景深成像的关键技术,包括基于焦距堆栈的数字处理方法、立方相位掩模的光学设计、对数非球面透镜的应用以及旋转点扩散函数的深度编码功能。通过实验验证和实际应用分析,展示了这些技术在显微镜成像、工业检测和医疗影像中的广泛用途及优势。同时探讨了未来发展方向,如智能算法优化、新型光学材料和多模态成像技术,为相关领域的技术创新提供了参考。

y2z3a4b5c的博客 168

jvm优化—— 图解垃圾回收

jvm优化—— 图解垃圾回收 jvm垃圾收集器jvm调优 从这篇开始我们开始探讨一些jvm调优的问题。在jvm调优中一个离不开的重点是垃圾回收,当垃圾回收成为系统达到更高并发量的瓶颈时,我们就需要对jvm中如果进行“自动化”垃圾回收技术实施必要的监控和调节。 这是jvm优化系列第一篇,其他请看以下: jvm优化必知系列——监控工具 对于调优之前,我们必须要了解其运行原理,java ...

陈诗道的博客 532

YOLOv13改进策略【Backbone/轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 670

2026.2.11:ollama api推理GLM-OCR模型识别图片

本文介绍了使用Ollama API调用GLM-OCR模型进行图片文字识别的过程。首先通过ollama pull glm-ocr:latest命令拉取模型,然后使用Python脚本调用API接口。代码示例展示了如何发送包含图片路径的请求,并处理返回的识别结果,支持文本、公式和表格三种识别模式。运行结果展示了模型对输入图片的识别效果,为开发者提供了便捷的OCR解决方案。

拥抱具身智能,昇腾Ascend C 367

图解JVM - 11.垃圾回收概述及算法

本文深入解析JVM垃圾回收机制,系统探讨内存泄漏、GC调优、Full GC频发等核心问题,结合典型案例与调优参数矩阵给出解决方案。针对高频面试考点,剖析引用类型、收集器原理及OOM排查技巧,通过多维度技术图解(如G1/ZGC创新设计)和实战命令,助力开发者构建完整的GC知识体系。

Anarkh_Lee的博客 1497

使用node-red网关读取modbus设备点表,并上传到市政低碳平台来统计数据

最近做了一个物联网项目,具体是这样的,利用node-red网关盒子,来采集Modbus设备的点表,然后将数据转换,封装,最终上传到市政的低碳平台。上一步封装了点表的数据,调用低碳平台还需要账号密码,建筑id,这些都是固定信息,所以我们单独提出来。上一步获取到了原始的点表数据,下一步就是将这些点表数据与在低碳平台创建的采集的对应起来,并且设置好分类。读取modbus的节点,会有两个输出,我是使用的第一个输出。msg.meters 是一个数组,里面的每一个元素都是一个点表,比如厨房用水,园区照明,

知无涯 948

图解Java 垃圾回收机制

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。垃圾回收机制的引入有效地解决了内存的回收问题使得他们在编写程序的时候不再需要考虑内存管理。本文首先着重介绍了判断一个对象是否可以被回收的两种经典算法,并详述了四种典型的垃圾回收算法的基本思想及其直接应用——垃圾收集器,最后结合内存回收策略介绍了内存分配规则。

Rico's Blogs 8万+

9、自动定理证明的发展历程与关键技术

本文全面介绍了自动定理证明的发展历程、关键技术及其实际应用,包括消解原理、参数化、支撑集策略等核心方法,并探讨了算法优化、数据结构优化及并行计算等提升效率的手段。同时,文章展望了未来发展方向,如深度学习在定理证明中的应用、交互式定理证明以及高阶逻辑的研究前景。

ll5678的博客 506

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JVM垃圾回收

由于并发标记阶段并未STW,因此用户线程可能对已经标记过的对象改变其它对象对其的引用,比如被标记为待回收的对象加上新的引用,结果导致被引用的对象会被回收,因此为了防止该现象,当对象的引用将要发生变化,在此之前,写屏障(pre-writer barrier)指令将其放入队列(satb_mark_queue),等到Remark阶段再将其更新回收标记防止误回收。②各标记阶段的区别:初始标记阶段的范围为根对象,并发标记扩大到整个堆,重新标记阶段才会STW,对整个堆范围标记,而且考虑到Old里的根对象。

jason_bone_的博客 1249

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

十五.吊打面试官系列-JVM优化-JVM垃圾回收器详解

继上篇文章《JVM垃圾回算法详解》,我们本篇文章来讲解一下JVM垃圾回收器。垃圾标记算法是标记哪些对象是垃圾,垃圾回收算法是回收的理论算法,垃圾回收器才是真正回收垃圾的组件。不同的垃圾回收器使用了不同的垃圾回收算法。

墨家巨子@俏如来 1696

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

<JVM上篇:内存与垃圾回收篇>13 - 垃圾回收器

<JVM上篇:内存与垃圾回收篇>13 - 垃圾回收器

LXYDSF的博客 1713

带你聊聊 jvm优化—— 图解垃圾回收 技术

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 从这篇开始我们开始探讨一些jvm调优的问题。在jvm调优中一个离不开的重点是垃圾回收,当垃圾回收成为系统达到更高并发量的瓶颈时,我们就需要对jvm中如果进行“自动化”垃圾回收技术实施必要的监控和调节。 这是jvm优化系列第一篇,其他请看以下: jvm优化必知系列——监控工具 对于调优之前,我们必须要了解其运行原理...

weixin_41663412的博客 235

转载:jvm优化—— 图解垃圾回收

转自:https://juejin.im/post/59dd7ce8f265da43052d9680 jvm调优中一个离不开的重点是垃圾回收,当垃圾回收成为系统达到更高并发量的瓶颈时,我们就需要对jvm中如果进行“自动化”垃圾回收技术实施必要的监控和调节。 对于调优之前,我们必须要了解其运行原理,java 的垃圾收集Garbage Collection 通常被称为“GC”,它诞...

anghuob40177的博客 144

JVM与垃圾回收笔记

JVM与垃圾回收1.JVM与Java体系结构1.1 Java虚拟机1.1.1 简介1.1.2 作用1.1.3 特点1.1.4 JVM的位置1.2 JVM的整体结构1.3 java代码执行流程1.4 JVM的架构模型1.5 JVM的生命周期1.5.1 虚拟机的启动1.5.2 虚拟机的执行1.5.3 虚拟机的退出1.6 常见的java虚拟机2.类加载子系统2.1 类加载器与类的加载过程2.1.1总体流程2.1.2 类加载子系统的作用2.1.3 类加载器ClassLoader角色2.1.4 类的加载过程 1.JV

Listen·Rain的博客 2019

【转】jvm优化—— 图解垃圾回收

在jvm调优中一个离不开的重点是垃圾回收,当垃圾回收成为系统达到更高并发量的瓶颈时,我们就需要对jvm中如果进行“自动化”垃圾回收技术实施必要的监控和调节。 对于调优之前,我们必须要了解其运行原理,java 的垃圾收集Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。因此本篇主要从这三个方面来了解: ...

weixin_30511039的博客 150

推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)

欢迎一起学习 《提升能力,涨薪可待篇》 《面试知识,工作可待篇 》 《实战演练,拒绝996篇 》 欢迎关注我csnd博客 也欢迎关注公 众 号【Ccww笔记】,原创技术文章第 一时间推出 如果此文对你有帮助、喜欢的话,那就点个赞,点个关注呗! 《能力提升,加薪可待-JVM篇》-JVM虚拟机(内存、垃圾回收、性能优化) 一. JVM内存区域的划分 1.1 java虚拟机运行时数据区 java...

Ccww_的博客 2290

java中jvm的垃圾回收_Java编程——jvm优化之 图解垃圾回收

多世纪,目前已经十分成熟了。因此本篇主要从这两个方面来了解:1. 哪些对象需要被回收?2. 如何回收?一、谁要被回收java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同是数据区域,这些区域有各自各自的用途。主要包含以下几个部分组成:1、程序计数器程序计数器占用的内存空间我们可以忽略不计,它是每个线程所执行的字节码的行号指示器。2、虚拟机栈java的虚拟机栈是线程私有的,生命周...

weixin_39989190的博客 107

【Java】图解 JVM 垃圾回收(二):垃圾收集器、Full GC

串行指的是垃圾收集器与用户程序交替执行,这意味着在执行垃圾收集的时候需要停顿用户程序;并行指的是垃圾收集器和用户程序同时执行。除了 CMS 和 G1 之外,其它垃圾收集器都是以串行的方式执行。

Data · Model · Agent · Repeat 1935
上一篇: 记一次使用Redis Cache引起的Bug排查及修复总结
下一篇: 涨见识!Java String转int还有这种写法
java架构师小芷
博客等级 码龄6年 216粉丝 519原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值