简单介绍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_…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
