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

类初始化、类加载、垃圾回收---JVM

创建对象过程

在这里插入图片描述

类加载

一个类从被加载到虚拟机内存中开始,到从内存中卸载,整个生命周期需要经过七个阶段:加载 、验证、准备、解析、初始化、使用和卸载。

类加载过程分为三个主要步骤:加载、链接、初始化
在这里插入图片描述

  • 加载:通过类的全限定名(包名 + 类名),获取到该类的.class文件的二进制字节流,将二进制字节流所代表的静态存储结构,转化为方法区运行时的数据结构(包括运行时常量池),在内存中生成一个代表该类的 Java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。Class 对象通过指针直接关联运行时常量池,例如:Class.getConstantPool() 可获取常量池。
  • 连接:验证、准备、解析 3 个阶段统称为连接。
    • 验证:检查类文件格式是否符合 JVM 规范
    • 准备:为类的静态变量分配内存并设置默认值。
    • 解析:将符号引用替换为直接引用。
  • 初始化:执行类的构造器方法(() ),要注意的是这里的构造器方法()并不是开发者写的,而是编译器自动生成的。
  • 使用:使用类或者创建对象
  • 卸载:如果有下面的情况,类就会被卸载:1. 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。2. 加载该类的ClassLoader已经被回收。 3. 类对应的Java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

双亲委派机制

双亲委派模型要求类加载器在加载类时,先委托父加载器尝试加载,只有父加载器无法加载时,子加载器才会加载。
在这里插入图片描述
①、避免类的重复加载:父加载器加载的类,子加载器无需重复加载。

②、保证核心类库的安全性:如 java.lang.* 只能由 Bootstrap ClassLoader 加载,防止被篡改。

垃圾回收

什么时候触发?

  • 内存不足时:当JVM检测到堆内存不足,无法为新的对象分配内存时,会自动触发垃圾回收。
  • 手动请求:虽然垃圾回收是自动的,开发者可以通过调用 System.gc() 或 Runtime.getRuntime().gc() 建议 JVM 进行垃圾回收。不过这只是一个建议,并不能保证立即执行。
  • JVM参数:启动 Java 应用时可以通过 JVM 参数来调整垃圾回收的行为,比如:-Xmx(最大堆大小)、-Xms(初始堆大小)等。
  • 对象数量或内存使用达到阈值:垃圾收集器内部实现了一些策略,以监控对象的创建和内存使用,达到某个阈值时触发垃圾回收。

怎么判定哪些是垃圾?

两种主流的垃圾回收算法:引用计数法和可达性分析算法

引用计数法

  • 原理:为每个对象分配一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1。当计数器为0时,表示对象不再被任何变量引用,可以被回收。
  • 缺点:不能解决循环引用的问题,即两个对象相互引用,但不再被其他任何对象引用,这时引用计数器不会为0,导致对象无法被回收。

可达性分析算法

在这里插入图片描述

垃圾收集算法

标记清除算法

在这里插入图片描述
标记-清除算法有两个缺陷,一个是 效率问题,标记和清除的过程效率都不高,另外一个就是,清除结束后会造成大量的 碎片空间

标记复制算法

在这里插入图片描述
缺点是 浪费了一半的内存空间

标记整理算法

在这里插入图片描述
缺点是 移动对象的成本比较高

分代回收算法

​垃圾回收算法本身不区分代,但 JVM 会根据不同代的特点选择合适的算法。新生代用复制算法,因为大部分对象生命周期短。老年代用标记-整理算法,因为对象存活率较高。
在这里插入图片描述

Minor GC、Major GC、Mixed GC、Full GC 都是什么意思?

  • Minor GC 也称为 Young GC,是指发生在年轻代的垃圾收集。年轻代包含 Eden 区以及两个 Survivor 区。
  • Major GC 也称为 Old GC,主要指的是发生在老年代的垃圾收集。是 CMS 的特有行为。
  • Mixed GC 是 G1 垃圾收集器特有的一种 GC 类型,它在一次 GC 中同时清理年轻代和部分老年代。
  • Full GC 是最彻底的垃圾收集,涉及整个 Java 堆和方法区。它是最耗时的 GC,通常在 JVM 压力很大时发生。

G1回收器

在这里插入图片描述
G1 ​仍然区分新生代和老年代,只是不再固定划分内存区域,而是 ​动态调整 Region 的分代角色。这种区域化管理使得 G1 可以更灵活地进行垃圾收集,只回收部分区域而不是整个新生代或老年代

G1 收集器的运行过程大致可划分为这几个步骤:

  1. 并发标记,G1 通过并发标记的方式找出堆中的垃圾对象。并发标记阶段与应用线程同时执行,不会导致应用线程暂停。

  2. 混合收集,在并发标记完成后,G1 会计算出哪些区域的回收价值最高(也就是包含最多垃圾的区域),然后优先回收这些区域。这种回收方式包括了部分新生代区域和老年代区域。
    选择回收成本低而收益高的区域进行回收,可以提高回收效率和减少停顿时间。

  3. 可预测的停顿,G1 在垃圾回收期间仍然需要「Stop the World」。不过,G1 在停顿时间上添加了预测机制,用户可以 JVM 启动时指定期望停顿时间,G1 会尽可能地在这个时间内完成垃圾回收。

相关文章:

  • 上传网站视频要怎么做才清楚班级优化大师免费下载安装
  • 广告代理公司排名seo优化费用
  • 辽宁省网站制作公司排名seo博客网站
  • uzi视频网站谁做的男生短期培训就业
  • 怎么做有声小说网站播音员最新舆情信息网
  • 外贸公司都是在什么网站做推广营销活动推广策划
  • Heap_dijkstra
  • SnakeMake搭建pipeline 1
  • 隔行换色总结
  • MCP vs LangChain:标准化协议与开发框架的优劣对比
  • 1. openharmony 南向开发之工具安装
  • Apple ID授权登入
  • C++中数组的概念
  • Docker Swarm集群搭建与管理全攻略
  • 7.3 在通知中显示图片或视频(UNNotificationAttachment)
  • LPDDR4内存颗粒命名规则全解析:三星、镁光、海力士、南亚、长鑫等厂商型号解码与选型指南
  • 搜广推校招面经七十
  • 蓝桥王国(Dijkstra优先队列)
  • 实战 | 基于 SpringBoot + MyBatis-Plus + UniApp 构建无人棋牌室管理系统:架构解析与性能优化
  • 【AI工具】FastGPT:开启高效智能问答新征程
  • 每日一题(小白)暴力娱乐篇19
  • Unity遮挡剔除与视锥剔除混合策略技术详解
  • 遍历算法及其应用详解
  • 【MQTT】
  • RVOS-1.环境搭建与系统引导
  • 《当区块链穿上防弹衣:落盘加密技术全景拆解》