当前位置: 首页 > news >正文

JVM——内存布局、类加载机制及垃圾回收机制

一、JVM内存布局

JVM内存布局也叫做JVM运行时数据区,由以下部分组成:

下面了解各区域的作用(重要):

1> 程序计数器:记录当前指令执行到哪个地址

2> 元数据区:保存当前类被加载好的数据(类名、方法名、方法参数个数等)

3> 栈:保存方法间的调用关系(本地方法栈保存的是本地方法间的调用关系,虚拟机栈保存的是Java方法之间的调用关系)


4> 堆:保存对象


二、JVM类加载

2.1 类加载机制

对于一个类,它的生命周期是这样的:

其中前5步是固定的顺序,也是类加载的流程,具体内容如下(重要):

1)加载

通过类的全限定名(包名+类名)找到.class文件并读取到内存中

2)验证

校验.class文件读取到的内容是否是合法的,并且将这里的内容转化为结构化的数据

3)准备

为类中定义的静态变量分配内存,并设置初始值

4)解析

将常量池中的符号应用改为直接引用

5)初始化

将类对象进行最终的初始化,对对象的各种属性进行填充(如果发现这个类的父类还没有加载,也会触发父类的类加载)


 2.2 双亲委派模型

双亲委派模型应用在类加载过程中的加载步骤的,它描述了类加载器(专门用于类的加载)之间的协作关系,JVM默认提供3种类加载器,委派过程如下(重要):


三、垃圾回收机制

3.1 死亡对象的判断算法

JVM中的垃圾回收,实际上是回收对象,以对象为单位,既然要回收垃圾,就需要先找到垃圾,相关算法主要有 1)引用计数算法  2)可达性分析算法

3.1.1 引用计数算法

算法思想:给对象增加一个引用计数器,每有一个地方引用,计数器+1,每有一个引用失效,计数器-1,只需要通过判断计数器中的值是否为0来判断对象为垃圾

JVM中并没有使用这种算法,主要是因为这个算法存在循环引用的问题:


3.1.2 可达性分析算法

可达性分析算法是JVM采取的死亡对象判断算法

算法思想:类似于遍历树/图,JVM会通过一系列称为“GC Root”的对象作为起点,不断向下遍历,遍历到的对象会被标记为可达,没有遍历到的对象会被标记为不可达,不可达的对象会被当作垃圾回收


3.2 垃圾回收算法
3.2.1 标记-清除算法

算法思想:算法分为“标记”和“清除”两个阶段,首先标记出所有待回收对象,标记完后统一回收所有被标记对象

缺点:

(1)效率问题:标记和清除两个过程的效率都不高

(2)空间问题:会产生内存碎片问题,导致后续需要分配较大对象时不得不提前触发另一次垃圾收集。


3.2.2 复制算法

算法思想:将内存划分为两份,每次只使用其中一份,将不用回收的对象复制到另一份空间,再将这份空间全部释放

缺点:

(1)空间利用率底    

(2)如果不是垃圾的对象太多,复制成本很高


3.3.3 标记-整理算法

算法思想:标记出待回收对象后,将所有存活对象都向一端移动,然后直接释放端边界以外内存(和顺序表删除元素类似,存活对象移动过程中将待删除对象覆盖)

缺点:移动过程开销太大


3.3.4 分代算法(JVM采取)

算法思想:将内存划分为两块,根据存活对象的周期不同(经历的GC次数)分为新生代和老年代,在新生代(Minor)中,每次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代(Full)中对象存活率高、没有额外空间对它进行分配担保,就必须采用"标记-整理"算法,具体细节如下图:

优点:

(1)一般认为,新生代中的大部分对象都会快速消亡,使得每次复制开销可控

(2)老年代的对象大部分生命周期较长,使得整理的开销也可控

http://www.dtcms.com/a/306087.html

相关文章:

  • Http401和403什么意思
  • 颐顿机电携手观远BI数据:以数据驱动决策,领跑先进制造智能化升级
  • 皮尔逊相关系数的理论基础、统计特性与应用局限
  • 操作系统:总结(part_1,part_2)
  • Python Pandas.get_dummies函数解析与实战教程
  • Python在自动化与运维领域的核心角色:工具化、平台化与智能化
  • 从零开始,在Windows环境部署vllm
  • Boost.Asio:探索异步I/O引擎核心
  • stm32的PID控制算法
  • 学习游戏制作记录(冻结敌人时间与黑洞技能)7.30
  • 【音视频】WebRTC 开发环境搭建-Web端
  • Apple基础(Xcode②-Flutter结构解析)
  • ica1靶机练习
  • K8s 备份与恢复利器:Velero 实战指南
  • MySQL常见面试题
  • springboot本地访问https链接,证书错误
  • Spark的宽窄依赖
  • Kubernetes 中 ConfigMap 与 Secret 的深度解析
  • gaussdb demo示例
  • Spring Cloud Gateway静态路由实战:Maven多模块高效配置指南
  • 时序数据库厂商 TDengine 发布 AI 原生的工业数据管理平台 IDMP,“无问智推”改变数据消费范式
  • ES 文件浏览器:多功能文件管理与传输利器
  • 数据建模怎么落地?从概念、逻辑到物理模型,一文讲请!
  • Kubernetes高级调度02
  • 《超级秘密文件夹》密码遗忘?试用版/正式版找回教程(附界面操作步骤)
  • AI任务相关解决方案11-基于 Qwen3+langchain+Agent 的学术论文编辑平台系统搭建与开发案例
  • Redis学习------缓存穿透
  • 【Python系列】如何安装无 GIL 的 Python 3.13
  • 区块链、Web3、元宇宙与AI融合的安全挑战:2025年深度分析
  • ICODE SLIX2有密钥保护的物流跟踪、图书馆管理ISO15693标签读写Delphi源码