一文了解JVM的垃圾回收

Java堆内存结构

java堆内存是垃圾回收器管理的主要区域,也被称为GC堆。

为了方便垃圾回收,堆内存被分为新生代、老年代和永久代。

新创建的对象的内存会在新生代中分配,达到一定存活时长后会移入老年代,而永久代存储的是类的元数据,在JDK1.8之后永久代被元空间取代,元空间不再位于堆内存中,而是位于本地内存,它们都是方法区的实现。

如何判断一个对象是垃圾呢?

堆中几乎存放了所有的对象实例,对堆进行垃圾回收首先是去判断哪些对象是垃圾。

引用计数法

在对象的对象头中会维护一个引用计数器,每有一个地方引用它,计数器就会加1,当断开引用了就会减1,当计数器的值为0时,说明这个对象是个垃圾。

这种方法简单,效率高,但是会有循环引用的问题。如果一个a对象和b对象之间互相引用,除此之外没有任何引用,那么ab对象的引用计数器的值都为1,就得不到释放。

可达性分析算法

以GC Roots对象为起点,向下搜索,节点走过的路劲成为引用链,如果一个对象没有引用链可以到达GC Roots对象,那么这个对象就是垃圾。

哪些对象是GC Roots对象?

  • 虚拟机栈中(栈帧中局部变量表)引用的对象
  • 本地方法栈中引用的对象
  • 方法区中的静态变量和常量引用的对象
  • 同步锁持有的对象

引用的类型

判断对象是否是垃圾还与引用的类型有关。

强引用:当我们去new对象的时候,创建的引用就是强引用,如果一个对象具有强引用,垃圾回收器宁愿抛出OOM错误也不会回收这个对象。

软饮用:如果内存充足就不回收,内存不足就会被回收。

弱引用:不管内存充不充足都会被回收。

虚引用:"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。

垃圾回收算法

标记-清除算法

通过可达性分析算法找到存活对象,也就是在GC Roots引用链上的对象,标记它们,然后清除未标记的对象。

这种算法的效率较高,而且垃圾回收后有太多内存碎片,如果是数组这种需要连续内存的对象,可能找不到内存空间。

标记-整理算法

找到存活的对象,标记它们,并让它们向同一端移动,然后清除端边界之外的内存。

这种算法解决了内存碎片化的问题,但由于要整理,所以效率不高,适合老年代这种垃圾回收频率不高的场景。

标记-复制算法

标记-复制算法将内存分为相同的两块,只使用其中一块内存,当那一块内存使用完之后,找到存活的对象,标记它们,然后把它们移到另一块内存上,再把之前使用的那块内存全部清除掉。

这种算法效率较高,而且内存没有碎片化,但是内存使用率太低,只有一半。

分代收集算法

通过对象存活时间的不同将内存分为了新生代和老年代。

其中新生代又分为伊甸园区(eden),幸存者区(S0、S1)。

新创建的对象会被分配到eden区,当eden区内存不足时,会采用标记-复制算法将eden区和
s0区(第一次复制没有对象)的存活对象复制到s1区,然后清除eden区和s0区的内存。之后又创建对象,当eden又满了之后就把eden区和s1区的存活对象复制到s0区,清除eden区和s1区的内存。由此循环,如果存活对象多次都没有被回收,会移到老年代中。

为什么要分代收集?为什么堆要被分为新生代和老年代?
因为这样可以根据各个年代的特点选择不同的垃圾回收算法,新生代的对象存活率低,就可以选择标记-复制算法,复制少量存活对象就可以完成垃圾回收;而老年代对象存活率高,不适合复制算法,采用标记-清除或者标记-整理算法。

什么是Minor GC、Full GC?
当进行垃圾回收的时候,会暂停所有线程去完成垃圾回收。
Minor GC :发生在新生代的垃圾回收,当eden区满了会触发,暂停时间较短。
Full GC:对新生代和老年代进行完整的垃圾回收,当老年代内存不足时会触发,暂停时间长,要尽量避免。

垃圾回收器

Serial垃圾回收器

serial垃圾回收器也叫串行垃圾回收器,是一个单线程的垃圾回收期,进行垃圾回收的时候,会暂停其他所有的线程,直到收集结束。

Parallel垃圾回收器

也叫并行垃圾回收器,使用多线程进行垃圾回收,垃圾回收时也会暂停其余所有的线程。
JDK1.8默认使用此垃圾回收器。

CMS垃圾回收器

也叫并发垃圾回收器,它的暂停时间很短,GC线程和用户线程并发工作。

CMS垃圾回收器的回收过程分为四个阶段:
初始标记:去标记和GC Roots对象直接连接的对象,会暂停其余线程,但时间很短。
并发标记:之后根据引用链标记其余的可达对象,不会暂停其余线程。
重新标记:防止在并发标记期间有新对象创建而漏标,会暂停其余线程,暂停时间短。
并发清除:清除未标记的对象,不会暂停其余线程。

G1垃圾回收器

G1垃圾回收器是JDK9之后默认的垃圾回收器。它将内存分为多个区域,每个区域都可以充当eden区,Survivor区,old区,humongous区,其中humongous区专门用于存放大对象。

G1垃圾回收器采用复制算法回收垃圾,主要有两种回收方式:Young GC和Mixed GC

G1垃圾回收流程
Young GC(对年轻代的回收)
首先新创建的对象会被分配到eden区,当eden区内存达到阈值后,触发Young GC,会选一个空区域作为幸存者区,然后将存活对象复制到幸存者区,并释放eden区的内存。

                 

当eden再次达到阈值,触发Young GC,选出一个新的空区域作为幸存者区,将eden区和旧幸存者区的存活对象复制到新幸存者区,并释放eden和旧幸存者区的内存,当经过多次Yong GC后还存活的对象会被复制到老年代。

Mixed GC(对年轻代和部分老年代的回收)
当老年代的内存达到一个阈值之后,会去并发标记老年代中的存活对象,无需暂停用户线程。
然后会去重新标记,防止并发标记导致漏标,此时会暂停用户线程。

之后进行Mixed GC,对年轻代部分老年代进行垃圾回收。对于年轻代,将eden区和旧幸存者区的存活对象复制到新幸存者区,并释放内存;对于老年代,不会去回收所有的老年代,而是选出存活对象较少的老年代,将它们的存活对象复制到一个新的老年代,然后释放内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL子查询与MyBatis映射

文章目录 前言1. 数据库表结构2. MyBatis Mapper XML3. Java 实体类4. 技术点解析5. 执行效果6. 优化建议 前言 提示:这里可以添加本文要记录的大概内容: 以下是一个结合 SQL 别名、子查询、MyBatis 字段映射和代码复用的完整案例,以用户管…

基于SpringBoot的“校园周边美食探索及分享平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园周边美食探索及分享平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 校园周边美食探索及分享平台结构图…

时间复杂度(Time Complexity)

时间复杂度 1. 什么是时间复杂度? 时间复杂度(Time Complexity)是计算算法执行时间随输入规模(n)增长的变化趋势。它衡量算法的效率,通常使用大 O 记号(Big-O notation)表示&#…

树莓派:更新源

发行版本 Debian 一直维护着至少三个发行版本:“稳定版(stable)”,“测试版(testing)”和“不稳定版(unstable)”。 发行版目录 下一代 Debian 正式发行版的代号为 bullseye — 发布…

K8s 1.27.1 实战系列(八)Service

一、Service介绍 1、Service 的作用与核心功能 Service 是 Kubernetes 中用于抽象一组 Pod 并提供稳定访问入口的资源。它解决了以下问题: ​Pod IP 不固定:Pod 可能因故障、扩缩容或更新导致 IP 变化,Service 通过 ClusterIP(虚拟 IP)提供固定访问地址。​负载均衡:自动…

RocketMQ性能优化篇

在分布式消息系统中,RocketMQ以其高性能、高可靠性和高可扩展性而被广泛应用。然而,为了充分发挥其性能优势,需要进行一系列的性能测试和优化。本文将从性能测试方法和优化实践两个方面,详细介绍如何对RocketMQ进行性能优化。通过…

CSS 知识点总结1

CSS 知识点总结1 今天写了两个页面,用到的知识点,总结一下 1. Flexbox 布局 display: flex;:启用 Flexbox 布局,用于创建灵活的容器。flex-direction: column;:将子元素垂直排列。justify-content:控制子元素在主轴…

双指针算法专题之——复写零

文章目录 题目介绍思路分析异地复写优化为就地复写 AC代码 题目介绍 链接: 1089. 复写零 思路分析 那么这道题我们依然可以使用双指针算法来解决 异地复写 先不考虑题目的要求,直接就地在原数组上修改,可能不太好想,我们这里可以先在一个…

Python控制语句 ——break和continue

1.以下关于Python循环结构的描述中,错误的是() 。 A、break用来结束当前当次语句,但不跳出当前的循环体。 B、遍历循环中的遍历结构可以是字符串、文件、组合数据类型和range函数等。 C、Python通过for,while等保留字构建循环结构。 D、continue只结束本次循环。 答案:A。在…

搭建阿里云专有网络VPC

目录 一、概述 二、专有网络vpc 2.1 vpc基本信息 2.2 vpc资源管理 2.3 vpc网段管理 三、交换机 四、NAT网关 4.1 绑定弹性公网IP 4.2 NAT网关信息 4.3 绑定的弹性公网IP 4.4 DNAT 4.5 SNAT 五、弹性公网IP 六、访问控制ACL(绑定交换机) 6…

阿里巴巴发布 R1-Omni:首个基于 RLVR 的全模态大语言模型,用于情感识别

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

《深度剖析:鸿蒙系统下智能NPC与游戏剧情的深度融合》

在游戏开发领域,鸿蒙系统的崛起为开发者们带来了前所未有的机遇与挑战。尤其是在开发基于鸿蒙系统的人工智能游戏时,实现智能NPC的行为逻辑与游戏剧情紧密结合,成为了打造沉浸式游戏体验的关键。 鸿蒙系统作为一款面向全场景的分布式操作系统…

聚划算!三个模型对比预测!CNN-GRU、GRU、CNN三模型多变量时序光伏功率预测

聚划算!三个模型对比预测!CNN-GRU、GRU、CNN三模型多变量时序光伏功率预测 目录 聚划算!三个模型对比预测!CNN-GRU、GRU、CNN三模型多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 CNN-GRU、GRU、CN…

C# 的 ManualResetEvent(线程同步操作) 类详解

C# 的 ManualResetEvent 类详解 作用 ManualResetEvent 是用于线程同步操作的类,允许一个或多个线程等待特定信号,以协调多个线程的执行顺序。它通过事件通知机制实现,确保线程在收到信号前保持阻塞,直到其他线程显式发出信号。…

小白学习:提示工程(什么是prompt)

课程链接 https://www.bilibili.com/video/BV1PX9iYQEry/?spm_id_from333.337.search-card.all.click 一 什么是提示工程 【提示工程】也叫【指令工程】 prompt就是给大模型发的指令,如“给我讲个笑话” 懂得提示工程原理会带来什么优势 懂得原理 为什么有的指…

Docker Compose 之详解(Detailed Explanation of Docker Compose)

Docker Compose 之详解 当容器数量逐渐增多,你是否感到手忙脚乱?面对复杂的部署场景,是时候祭出神器Docker Compose了!它能帮你优雅地管理多容器应用,一键启动、停止所有服务,不再为复杂的手动操作焦头烂额…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷一)

目录 1. 内存和地址 2. 指针变量和地址 2.1 取地址操作符(&) 2.2 指针变量 2.3 解引用操作符 (*) 3. 指针的解引用 3.1 指针 - 整数 3.2 void* 指针 4. const修饰指针 4.1 const修饰变量 4.2 const修饰指针变量 5…

【AI】从头到脚详解如何创建部署Azure Web App的OpenAI项目

【AI】从头到脚详解如何创建部署Azure Web App的OpenAI项目 在Azure Web应用上,您可以使用Python的OpenAI包方便快捷地调用官方API,上传您的训练数据,并利用他们的算法进行处理。本教程提供了一个逐步指南,帮助您在Azure Web应用上部署您的OpenAI项目,涵盖了从资源设置到…

机器视觉工程师红外相机的选择:红外长波工业相机和短波红外工业相机玄机大总结

红外长波(LWIR)和短波(SWIR)工业相机在原理、应用场景和技术特点上有显著差异。以下是它们的对比分析: 1. 波长范围与成像原理 2. 技术特点 3. 典型应用场景 4. 优缺点对比 LWIR优势: 无需光照,适用于完全黑暗环境。 直接反映物体温度分布。 对烟雾、灰尘穿透能力强。…

uni-app学习笔记——自定义模板

一、流程 1.这是一个硬性的流程,只要按照如此程序化就可以实现 二、步骤 1.第一步 2.第二步 3.第三步 4.每一次新建页面,都如第二步一样;可以选择自定义的模版(vue3Setup——这是我自己的模版),第二步的…