浅显易懂的简单说一下jvm内存模型

news2024/11/26 4:38:08

说起JVM大家都知道,它是运行java代码的基础。那么关于JVM 内存模型是不是很模糊 我用通俗易懂的方式说一下

我们这里先介绍 JVM 堆内存 它有两大块  包括 新生代内存,和老年代内存 。

为啥分为这两块, 你可以这样理解,(我这里先假设你懂GC回收方面的基础知识)。GC回收对象,有的对象被经常用到,有的呢没有被经常用到,这些经常用的对象 要是反复被创建是不是非常麻烦,举个生活中的例子,你整理一间屋子 是不是经常用到的东西会放到显眼,而且好拿的位置。不经常用的 都放床底下啦对不对。道理一样

那么 经常用到的对象 会放到老年代内存中,新被创建的对象 会放到新生代内存中。

新生代内存包括啥。 如上图所示,新生代 包括  EdenFrom SurvivorTo Survivor

Eden这个单词啥意思  伊甸园的意思,代表新生的意思,也就是 你刚new 出来一个对象 就会进入的到这里,GC是垃圾回收,每隔一段时间会自动回收对象。

然后在看一下Survival 区 (包含From 和TO )这个区字面意思是幸存者区,也就是GC 清除Eden区 能幸存留下来的 都会移动到这里。

这里有一个问题,GC 依据什么 来确定这个对象到底清楚还是迁移到Survival区  GC 会通过GCRoot 来找这个对象 有没有被引用 ,如果 没有被引用旧清除掉

  这里注意下,有一个问题,就是循环引用,你想啊 有两对象 相互引用对方 ,这两对象永远没有被使用了,但是还相互指向对方, 那是不是 永远不会被清除掉,这就是GC Root解决的问题,  可达性分析算法 ,原理就是一路追踪到最后, 看看到底最终的哪一个对象,有没有被人使用,最终没有被使用 那么整个一条链路 就没有存在的意义。

咱们话说回来,Minor GC 在运行是扫描Eden区 他看到对象 A 这次有引用了 就迁移到Survivor区,然后计数一次,每次扫描加1 等到计数达到15次之后 GC 认为他是一个 经常被使用的对象,那么 直接晋级到老年代区(先简单了解大体过程 一会在详细说 ,这涉及到GC算法问题)

 在晋级到老年代区的时候,涉及到一个概念叫空间分配担保 ,在讲这个概念前 我需要给你讲一个生活场景便于理解。

对象晋级老年代的时候 发现老年代空间满了,放不下了咋办,为了避免这种情况,在执行Minor GC 时候 先看一下老年代空间还剩多少,够不够放新生代所有对象的空间(就是我先往大了预估我假设你们全部晋级老年代),如果够那没问题了 ,但是如果不够的话咋办,HandlePromotionFailure 检查一下这个开关如果是true  它会这样做,看看往次Minor GC 大部分都晋级多少对象  算一个平均数 预估一下,如果算出来的平均数能满足 晋级到老年到  那么来吧 。但是也有风险 这里只是 预估一下万一 预估不准确,那就歇菜了,但是预估的数据不满足 那么老老实实还是先把老年代 数据 清除一下腾腾地方 (FUll FC)

再说一下 GC 算法

你想这样一个场景,好声音开始的时候 是海选,在茫茫人海的参赛选手中选择基本上,唱功还可以的 人参加节目。这意味着是不是要淘汰掉很多人,简单理解是大量的人中选出一小部分 ,而 到了最后的上电视节目参赛环节,就是再一小部分人中,那么逐步再淘汰一部分人。

先看 海选环节应该是找出唱功还可以的参加节目,然后剩下的人淘汰掉,你不能反过来说 我找不优秀的, 剩下的都是优秀的吧,那不有毛病吗。我们的新生代Eden区就类似于 海选阶段,这里用到的算法是 复制算法,把优秀的人标记一下然后,复制到 一个区域(就类似于好声音海选出来的选手参加节目)然后把剩下的 全部清除掉。

说一下具体过程:具体是这样 ,在执行Minor GC 时候 先把Eden区和Survivor 中的From 区满足 要求的 挑选出来,挑选出来之后 放到Survivor TO 区 然后把剩下淘汰掉 就是吧Eden 和From 区 统一清除掉,然后呢 在把TO 区放回到From区,这里注意下假如TO区满了 直接 放到老年代里边去,也就是TO区只是一个腾挪的地方 

好声音最后 上节目进行淘汰赛 ,把唱的不好的人一个个淘汰掉 ,这就类似于我们的老年代, 里边都是一个长久存活对象  要找出来 没有被引用的,这就用到标记清除算法,就是先标记,找出没有引用的对象,然后再清除掉就可以了(这里记住是两步 先标记再清除)。

其实关于标记清除算法 真正在的收集中是有优化的,叫标记清除整理算法,因为 你标记清除之后 内存空间会不连续,他在清除之后会整理一下,统一移动到一端,然后 留出空闲的连续空间,这样 可以 保证一些连续的空间可以使用(例如数字)。

再说一下三色标记:

先说一下为什么要三色标记,以下摘抄自阿里-通义灵码

JVM 中的三色标记算法主要用于实现并发的垃圾收集(Garbage Collection, GC),特别是用于解决在垃圾回收过程中如何安全地并发进行对象标记的问题。传统的标记清除算法在进行标记阶段时通常需要暂停所有的用户线程(Stop-The-World),以确保在此期间不会发生对象引用关系的变化,从而准确地标记出哪些对象是“存活”的,哪些是“垃圾”。
三色标记算法通过引入三种颜色来区分对象的不同状态,从而允许标记过程与用户程序并发执行:
白色:表示对象尚未被垃圾收集器访问过,可能是垃圾。
灰色:表示对象已被垃圾收集器发现,但其引用的对象还没有被访问和标记。
黑色:表示对象已经被垃圾收集器访问过,不仅自身是可达的(即非垃圾),而且其引用的所有对象也都已经被标记过(或递归标记过)。

GC 在并发标记(虽然JDK 没有完全舍弃STOP THE WORLD)的过程中,为了 防止 和用户线程产生标记冲突 比如 本来应该清除的对象 标记为存活, 本来应该存活的对象 标记为清除

第一种好办,大不了下次在清除,但是第二种就危险了。举个例子 A对象引用B对象B引用C对象

A>B>C. 现在用户线程突然改动了A>C, B到C的引用关系删除,而GC 正好执行到B 发现B没有指向了 所以 这个时候 就认为 C要删除 。(其实就是GC不会返回去再查一下)。这就是三色标记中的误标问题。

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

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

相关文章

【图论】【拓扑排序】1857. 有向图中最大颜色值

本文涉及的知识点 图论 拓扑排序 LeetCode1857. 有向图中最大颜色值 给你一个 有向图 ,它含有 n 个节点和 m 条边。节点编号从 0 到 n - 1 。 给你一个字符串 colors ,其中 colors[i] 是小写英文字母,表示图中第 i 个节点的 颜色 &#xf…

代码随想录算法训练营DAY14|C++二叉树Part.1|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

文章目录 二叉树的递归遍历思路CPP代码 二叉树的迭代遍历思路前序遍历后序遍历后序遍历 二叉树的统一迭代法 二叉树的递归遍历 144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历 文章讲解:二叉树的递归遍历 视频讲解:每次写递归都要靠直…

寒冬已逝,“量子春天”正来

最近,全球对量子技术领域的私人投资有所下降,引发了一些观点认为这个领域可能正逐渐衰退。 政治家、资助者和投资者并不总是以科学为关注焦点。然而,某些科技领域偶尔会成为热点,正如20世纪50年代核能技术的兴起,那时人…

ios 之 netty版本swiftNio(socket创建)

SwiftNio 简介 用于高性能协议服务器和客户端的事件驱动、无阻塞的网络应用程序框架。 SwiftNIO是一个跨平台异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 这就像Netty,但是为Swift写的。 Xcode引入swiftNio 在实…

联诚发2024第二季度高质量发展工作推进会议顺利召开

4月1日上午,联诚发LCF以“稳中创新•产业升级•高质量发展”为主题的第二季度企业高质量发展工作推进大会在联诚发深圳总部隆重召开。会议总结上一季度的工作成果,分析研判当前形势,谋划部署下一季度工作,团结动员公司全体职工凝心…

Web3:数字化社会的下一步

随着技术的不断进步和互联网的发展,我们正逐渐迈入一个全新的数字化社会阶段。在这个新的时代,Web3作为数字化社会的重要组成部分,将发挥着举足轻重的作用。本文将探讨Web3在数字化社会中的意义、特点以及对未来发展的影响。 1. 重新定义数字…

设计模式——行为型——责任链模式Chain Of Responsibility

请求类 public class ApproverRequest {private int type;//请求批准的类型private float price;//请求的金额private int id;//请求的编号 } 审批人抽象类 public abstract class ApproverPerson {protected ApproverPerson next;protected String name;//审批过程public a…

【好书推荐4】图机器学习

【好书推荐4】图机器学习 写在最前面编辑推荐内容简介作者简介目录前言/序言本书读者内容介绍 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限可能…

nut-ui中的menu 菜单组件的二次封装

这个菜单组件 一般可以直接用到项目里 如果复用性不强的话 直接使用 但是有一个问题 如果很多地方都需要用到这个组件 我们可以把这个组件二次封装一下 <template><div class"cinema-search-filter-component"><nut-menu><template #icon>&…

交流耦合和直流耦合

一、 AC和DC定义 在选择输入模式时&#xff0c;可能选择不同的耦合方式会影响到数据中的频率成分。大多数信号都有AC成分和DC成分&#xff0c;DC成分是0Hz的部分&#xff0c;对应时域信号中的直流分量&#xff08;或称为直流偏置&#xff09;&#xff0c;AC成分是信号中的交变部…

VCRUNTIME140_1.dll丢失是怎么回事?多种解决方法帮你搞定

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“vcruntime140_1.dll文件丢失”。那么&#xff0c;这个文件是什么&#xff1f;它的作用是什么&#xff1f;当它丢失时&#xff0c;会提示什么样的错误信息呢&#xff1f;本文将详细介绍vcru…

谷粒商城实战(009 缓存-分布式锁)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第158p-第p165的内容 分布式锁 原理和使用 使用下shell对产生的命令进行发送 查看 -> 撰写 -> 撰写栏 idea 选中的代码提取成方法 加锁…

使用tcpdump和wireshark进行服务器抓包分析

目录 前言 1.tcpdump简介 2.Wireshark简介 3.实际案例 4.代码示例 5.总结 前言 服务器抓包分析是一种非常常见和有效的网络故障排查和性能优化手段。通过捕获服务器上的网络流量&#xff0c;可以帮助我们深入了解服务器与其它设备之间的通信情况&#xff0c;发现问题并进…

基于8086贪吃蛇游戏系统方恨设计

**单片机设计介绍&#xff0c;基于8086贪吃蛇游戏系统方恨设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086的贪吃蛇游戏系统设计是一个结合了微处理器控制、游戏逻辑以及图形显示技术的综合性项目。该系统旨在通过8086微处理器…

JAVA----线程

线程 上回说到 进程 > 运行起来的程序 > 并发编程 > 多核 CPU 操作系统管理进程: 先描述 > PCB 结构体 来把进程的各种属性都表示出来再组织 > 通过链表数据结构把多个 PCB 串起来. PCB 核心属性(进程调度) pid 进程标识符内存指针, 该进程依赖的 指令…

NIKKI DENSO伺服驱动器维修NCR-CAB1A2D-801B

NEXSRT伺服驱动器维修NPSA-MU日机电装伺服维修ACTUS POWER&#xff0c;NCS-ZE12MDA/ZE1MDA-601A&#xff0c;NEXSRT日机电装伺服维修NCS-ZE12MDB-401A/NCS-ZAMDA-401AG。 NIKKI常见故障原因及处理方法&#xff1a; 1、电机在一个方向上比另一个方向跑得快&#xff1b; (1) 故…

Keil MDK 5.37 及之后版本 安装 AC5(ARMCC) 编译器详细步骤

由于 Keil 5.37 及之后版本不再默认安装 AC5(ARMCC) 编译器&#xff0c;这就会导致由 AC5 编译的工程无法正常编译&#xff0c;往往输出窗口会提示以下信息&#xff1a;*** Target ‘STM32xxxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available. —…

Redis数据库:概念、安装及常用操作命令

目录 前言 一、数据库概述 1、关系型数据库&#xff08;RDBMS&#xff09; 1.1 产生背景 1.2 概念 1.3 特点 1.4 优缺点 1.5 常见主流关系型数据库 2、非关系型数据库&#xff08;NoSQL&#xff09; 2.1 产生背景 2.2 概念 2.3 特点 2.4 优缺点 2.5 常见主流非关…

实验三 Java类的继承与派生(计算机专业)

实验三 Java类的继承与派生&#xff08;头歌&#xff09; 制作不容易&#xff0c;点个关注&#xff01;给大家带来更多的价值&#xff01; 目录 实验三 Java类的继承与派生&#xff08;头歌&#xff09;** 制作不容易&#xff0c;点个关注&#xff01;给大家带来更多的价值&…

HBase(超级无敌详细PROMAX讲解版)

简介 概述 图-1 HBase图标 HBase原本是由Yahoo!公司开发的后来贡献给了Apache的一套开源的、基于Hadoop的、分布式的、可扩展的非关系型数据库(Non-Relational Database)&#xff0c;因此HBase不支持SQL(非关系型数据库基本上都不支持SQL)&#xff0c;而是提供了一套单独的命…