简单介绍JVM
1.什么是JVM?
JVM就是Java虚拟机【Java Virtual Machine】,简称JVM。主要部分包括类加载子系统,运行时数据区,执行引擎,本地方法库等,接下来我们一一介绍
2.类加载子系统
JVM中运行的就是我们日常写的JAVA代码,代码经过编译加生成.class文件,在经过类加载子系统加载到内存中,如图:

3.JVM运行时数据区

3.1方法区(内存共享)
存储的就是类对象,包括类方法和对象方法
存储数据是公共的,所有线程都可以访问这个区域
补充:方法区别称
JDK7称为永久代
JDK8及以后称为元空间
补充**:如何区别类方法和对对象方法?**
对象方法调用时会有一个隐式this引用,表示当前对象自己,而类对象全局统一。
3.2堆(内存共享)
用来存放在代码中用new关键字创建的对象。也是JVM中内存使用最大的区域。
3.3JAVA虚拟机栈(线程私有)
每创建一个线程都会在内存中创建一个对应的虚拟机栈,栈中存放的是栈帧。
该线程每调用一个方法虚拟机中就会入栈一个栈帧,栈帧中存储的信息与该方法息息相关,主要包括局部变量表,操作站栈,动态连接,方法返回地址,如图:

所以当某线程虚拟机栈空了,也就说明该线程中的方法已经执行完毕,反之亦然。
3.4本地方法栈
调用本地方法时使用的栈
3.5程序计数器(线程私有)
用来记录线程当前执行到了哪一行,下次CPU调度时从计数器位置开始执行,(多线程)
搞懂了这些部分分别是做什么的,我们再来说**.class文件时如何被JVM加载并运行**
1.类加载子系统把.class文件加载到运行时数据区。
2.将类对象,类方法和对象方法存在方法区,后续new对象可以直接从这里找到模板,以便进行对象创建操作。
3.new 出来的对象全部放在堆区。
4.创建的每个线程分配一个虚拟机栈,线程中被调用的方法信息记录在栈帧中并依次入栈,可以说栈中存的是线程对方法的调用层级。
5.本地方法栈中存的是本地方法的调用层级。
6.程序计数器,记录的是当前线程的执行的行号。
4.JVM类加载过程

4.1加载
通过类的全限定名找到所有的.class文件,加载到内存中
4.2验证
验证.class文件是否符合JVM标准
4.3准备
为静态变量以及静态方法分配内存空间并按照数据类型设置初始值(例如:int 初始值为0)。
4.4解析
JVM把常量池中的符号引用(例如:int 符号引用为I)替换为真实引用
4.5初始化
执行类的初始化代码(被static修饰的)
4.6使用
使用的也就是刚刚加载的类,所以使用阶段也是new对象,执行构造方法和父类构造方法的阶段。
4.7卸载
程序停止时–从JVM中卸载。
5.双亲委派模型
双亲委派模型是Java类加载器的一种工作模式,该模式主要用于JVM类加载阶段,用于保证JDK中定义的类不被恶意修改。以下是它的工作图:

具体流程:
1.当创建一个类时,先从应用加载器开始向上转发,一直到启动加载器
2启动加载器在自己路径下找这个类,若找到则加载,没有则向下转发给扩展加载器
3.扩展加载器在自己路径下找这个类,若找到则加载,没有则向下转发给应用程序加载器
4.应用程序加载器在自己路径下找这个类,找到则加载,找不到则报异常或错误
6.垃圾回收
说完了类的加载和卸载,我们来讲对象是如何被回收的,毕竟我们前面讲堆区是JVM中使用内存最大的区域,为什么最大?因为程线程中创建的各种对象多呗,有时一个对象被创建可能仅仅使用一次就不用了,对于这些对象我们要及时回收,不然放那不管是占内存的。
那垃圾回收中的“垃圾”其实也就是不再使用的对象,垃圾回收也就是回收对象占用的堆内存。
所以问题就在于如何标识对象是否死亡?
6.1引用计数算法
核心思想:对于堆中对象,引用一次计数加一,消除引用一次计数减一,当堆中对象引用计数为0时表示该对象已经死亡。
该算法缺点:内存泄漏----堆中某个对象对应的内存空间永远也回收不了。
举个例子:

经过上诉一番操作,t1对象和t2对象虽然还未死,但是:t1.instance所引用的对象永远也访问不了,那这个内存就回收不了,所以这种算法我们一般不用。
6.2可达性分析算法
核心思想:通过某一个根节点(GC root)出发访问不到某个对象,则判定该对象死亡,本轮GC标记,下轮GC回收内存空间。
6.3标记-清除算法
判定哪些对象已死亡需要回收我们OK了,那么如何回收死亡对象呢?
首先登场的时标记-清除算法,工作原理如下图:

GC:一次垃圾回收,垃圾回收的时候会停止所有用户进程(STW,Stop The World)
缺点:会产生大量不连续的空间碎片(看图也能看出来)
导致如果有一个大对象将会没有足够的内存空间存放-------》导致再次触发GC-------》再次触发STW,而GC的时间是不可控的,一秒一天一周都有可能,随着计算机和网络的发展,这样的时间成本是不可接受的。
6.4复制算法
工作原理如下图:

核心思想:将内存区域划分为两个大小相等的区域,区域1来放对象,区域2暂时空闲,当GC开始时,先将区域未死亡对象复制到区域2并按照内存地址顺序整理好,然后全面清除区域1,完成一次完整GC。
优点:解决了内存空间不连续的问题。
缺点:空间利用率不高,只有一半,如果要存储8G对象就要准备至少16G空间。
6.5标记整理算法
核心思想:每回收一次对象后,将剩余对象向一端整理。,具体如下图:

核心思想:在回收死亡对象之后将剩余对象向一端移动。
优点:空间利用率提升了,不再是50%了。
缺点:在移动对象的过程中效率势必会受很大影响。
6.6分代算法(GC中真正使用的算法)
核心思想:将整个内存区域分为新生代(占内存三分之一)和老年代(占内存三分之二)
新生代用来存放刚new 出来的对象,大部分“朝生暮死”老年代用来存放在新生代经历多次GC而未被回收的对象。
新生代采用复制算法,老年代采用标记-整理算法。
新生代又分为Eden区,From区和To区,Eden区占新生代内存的五分之四,剩余由From区和To区占有。
具体回收过程如下图:

每个对象的对象头中有一个字段记录着该对象“年龄”,每GC一次而未被回收则年龄加一,在新生代中,年龄超过某个特定值(一般默认为15)则会被强制移到老年代。
相关文章:
简单介绍JVM
1.什么是JVM? JVM就是Java虚拟机【Java Virtual Machine】,简称JVM。主要部分包括类加载子系统,运行时数据区,执行引擎,本地方法库等,接下来我们一一介绍 2.类加载子系统 JVM中运行的就是我们日常写的JA…...
纷析云:赋能企业财务数字化转型的开源解决方案
在企业数字化转型的浪潮中,财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案,为企业提供了一条理想的转型路径。 一、开源的力量:自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…...
DeepSeek开源周第二弹:DeepEP如何用RDMA+FP8让MoE模型飞起来?
一、引言:MoE模型的通信瓶颈与DeepEP的诞生 在混合专家(MoE)模型训练中,专家间的全对全(All-to-All)通信成为性能瓶颈。传统方案在跨节点传输时带宽利用率不足50%,延迟高达300μs以上。DeepSee…...
NLP学习记录十:多头注意力
一、单头注意力 单头注意力的大致流程如下: ① 查询编码向量、键编码向量和值编码向量分别经过自己的全连接层(Wq、Wk、Wv)后得到查询Q、键K和值V; ② 查询Q和键K经过注意力评分函数(如:缩放点积运算&am…...
【MySql】EXPLAIN执行计划全解析:15个字段深度解读与调优指南
文章目录 一、执行计划核心字段总览二、关键字段深度拆解1. type(访问类型)——查询性能的晴雨表典型场景分析: 2. key_len(索引使用长度)——索引利用率的检测仪计算示例: 3. Extra(附加信息&a…...
论文笔记(七十二)Reward Centering(五)
Reward Centering(五) 文章概括摘要附录B 理论细节C 实验细节D 相关方法的联系 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arX…...
Linux内核自定义协议族开发指南:理解net_device_ops、proto_ops与net_proto_family
在Linux内核中开发自定义协议族需要深入理解网络协议栈的分层模型。net_device_ops、proto_ops和net_proto_family是三个关键结构体,分别作用于不同的层次。本文将详细解析它们的作用、交互关系及实现方法,并提供一个完整的开发框架。 一、核心结构体的作用与层级关系 struct…...
SOME/IP-SD -- 协议英文原文讲解6
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.3.1 E…...
【数据处理】COCO 数据集掩码 Run-Length Encoding (RLE) 编码转二进制掩码
输入:结果.json 输出:mask.jpg json内容示例如下: {"labels":[ # class_id 1,2,3,...],"scores":[ # 置信度0.2,0.7,0.3,...],"bboxes":[[1244.0,161.0,1335.0,178.0],[1243.0,161.0,1336.0,178.0],[1242.0,1…...
Java中的缓存技术:Guava Cache vs Caffeine vs Redis
在Java中,缓存技术是提升应用性能的重要手段。常见的缓存技术包括Guava Cache、Caffeine和Redis。它们各有优缺点,适用于不同的场景。以下是对它们的详细对比: 1. Guava Cache 类型: 本地缓存 特点: 基于内存的缓存,适用于单机应…...
Day8 蓝桥杯acw讲解
首先先给大家看一道这个题, 我真的是太喜欢y总了,如果大家也是最近在准备蓝桥杯或者计算机相关的比赛,但是得加一个前提就是必须最好基础真的很好,要不然其实买了课,也没啥太大的用处,其实就可以以我本人举…...
《Operating System Concepts》阅读笔记:p147-p158
《Operating System Concepts》学习第 15 天,p147-p158 总结,总计 12 页。 一、技术总结 1.socket (1)定义 A socket is defined as an endpoint for communication(socket 是用于通信的端点,或者说socket 是通信端点的抽象表示。). A s…...
JSON Schema 入门指南:如何定义和验证 JSON 数据结构
文章目录 一、引言二、什么是 JSON Schema?三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例:定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…...
java后端开发day20--面向对象进阶(一)--static继承
(以下内容全部来自上述课程) 1.static–静态–共享 static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。 1.静态变量 被static修饰的成员变量,叫做静态变量。 特点: 被该类…...
FastJSON 默认行为:JSON.toJSONString 忽略 null 字段
完整的 FakeRegistrationController 代码,这让我可以全面分析后端逻辑,特别是为什么空的字段(如 compareDate)不返回给前端。我将详细分析代码的每个接口,尤其是与 list 请求和字段返回相关的部分,并解释原…...
数据结构:基数排序(c++实现)
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 基数排序的定义和基本原理基本原理具体步骤 基数排序的优缺点:代码实现总结 基数排序的定义和基本原理 基数排序(Radix Sort)是一…...
DOM 事件 HTML 标签属性速查手册
以下是一份 DOM 事件 & HTML 标签属性速查手册,涵盖常用场景和示例,助你快速查阅和使用: 一、DOM 事件速查表 1. 鼠标事件 事件名触发时机适用元素示例代码click元素被点击任意可见元素button.addEventListener(click, () > { ... …...
PhotoShop学习01
了解Photoshop 这里省略了Photoshop的软件安装,请自行查找资源下载。 1.打开图片 下图为启动photoshop后出现的界面,我们可以通过创建新文件或打开已有文件来启用photoshop的工作界面。 可以通过左边的按钮进行新文件的创建或打开已有文件。 也可以点…...
mongodb【实用教程】
MongoDB 是一个开源的文档型数据库管理系统 下载安装 Windows 系统 https://blog.csdn.net/weixin_41192489/article/details/126777309 GUI工具 【推荐】MongoDB Compass https://www.mongodb.com/zh-cn/docs/compass/current/ Robo 3T https://blog.csdn.net/weixin_4119248…...
C语言机试编程题
编写版本:vc2022 1.求最大/小值 #include<stdio.h> int main(){int a[50],n;int max, min;printf("请输入您要输入几个数");scanf_s("%d", &n);printf("请输入您要比较的%d个数\n",n);for (int i 0; i<n; i) {scanf_…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
