JVM的一些知识
JVM简介
JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机。
虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。
JVM 和其他两个虚拟机的区别:
- VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器;
- JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进
行了裁剪。
JVM 是一台被定制过的现实当中不存在的计算机。
JVM 类加载的过程
- 加载
Java程序的 .Java 文件, 通过 javac 编译成 .class 文件, 存储在硬盘上, 当运行 Java 进程的时候, jvm 需要读去 .class 文件里面的内容, - 验证
验证读到的 .class 文件的数据是否正确, 是否合法 (在 Java 的标准文档中, 明确定义了 .class 文件的格式是什么样的) - 准备
根据读取到的内容尾类的静态变量分配内存, 将其设置为初始值比如 boolean 就设置成 false, 对象引用就设置成 null, 不会进行赋值的操作
(创造一个内存空间, 全部设为初始值) - 解析
Java虚拟机将常量池内的符号引用替换成了直接引用 (符号引用相当于就是一个名字, 比如 String s = “hello” 符号引用类似 hello, 直接引用可以理解成内存地址比如 0x19) - 初始化
针对类对象做最后的初始化操作, 执行静态成员的赋值语句 (此时静态代码块以及父类也会在这一阶段被加载)
死亡对象的判断算法
1. 引用计数法
给对象增加一个计数器, 每当有一个地方引用这个对象, 计数器就 +1, 当引用失效的时候就 -1, 一旦对象的计数器变成了 0, 就代表失效
但是主流的 jvm 都没有使用引用计数法, 主要是无法解决循环引用的问题
public class Test {public Object instance = null;private static int _1MB = 1024 * 1024;private byte[] bigSize = new byte[2 * _1MB];public static void testGC() { Test test1 = new Test(); Test test2 = new Test(); test1.instance = test2; test2.instance = test1; test1 = null;test2 = null;// 强制jvm进行垃圾回收System.gc(); }public static void main(String[] args) {testGC(); }}
比如以上的情况, 就会发生无法回收的情况, 但是其实也引入了回路检测的算法, 可以解决这种问题
2. 可达性分析算法
通过一系列成为 GC Root 的对象, 进行不断向下搜索
(类似 jvm 手上有一份名单, 然后所有的 root 进行向下搜索, 如果发现有无法到达的对象, 即可说明该对象是不可用的)
GC Root 有很多个比如
- 栈上的局部变量
- 元数据区的静态变量
- 常量池引用指向的对象
垃圾回收算法
1. 标记清除算法
先标记再清除, 根据上述可达性算法, 先从所有的 GC Root 遍历一遍, 标记为存活对象, 之后遍历清除没有被标记的对象, 从而回收内存
优点
- 实现简单
- 无需移动对象
缺点
清除后会产生内存碎片, 导致内存的利用率变低
2. 复制算法
内存区域直接划分成两块, 只使用其中一块, 单进行垃圾回收的时候, 将存活对象从当前区域, 直接移动到另一块区域, 对当前区域进行整体回收操作
优点
空间碎片减少
缺点
- 空间利用率较低
- 对象多的时候, 复制成本大
3. 标记整理算法
一样通过 GC Root 对所有对象进行可达性的判断, 标记一下对象是否存活, 对存活的对象进行整理, 连续排列, 清理出连续的空间
优点
解决了内存碎片的问题
缺点
移动整理对象会产生搬运的开销
4. 分代回收算法
解析
- 分成三个区, 分别是伊甸区、幸存区、老年区
- 开始 new 出来的对象, 都会先放在伊甸区 (伊甸区是比较大的) , 根据经验规律 90% 的对象都是活不过第一轮 GC, 所以剩下活下来的会放到其中一个幸存区, 然后清空另一个幸存者区和伊甸区, 下一轮对象加入伊甸区再次 GC 后, 将幸存的对象和存放上一轮 GC 的存活对象放入到另一个幸存者区, 然后回收伊甸区和另一个幸存区的空间
- 当经历过好几轮的 GC 之后, 就会把多轮存活的对象转移到老年代
- 老年代的 GC 频率相较伊甸区的 GC 频率要低很多
优点
- 提高了回收的效率
- 减少了 STW 的时间
缺点
堆内存进行分区管理, 较为复杂
双亲委派模型
输入: 类的全限定名 , 类似于 java.lang.String
目的
防止用户写的类, 把标准库的类给覆盖掉, 保证标准库的类优先级最高, 扩展库其次, 第三方库的优先级最低
JVM内存区域的划分
1. 程序计数器, 保存了下一条要执行的指令的地址 (下一条指令是 Java的字节码)
2. 堆, jvm 最大的空间, new 出来的对象都在堆上
3. 栈
1. Java 虚拟机栈, 运行 Java 代码的方法调用关系, 存储函数中的局部变量, 函数的形参, 函数之间的调用关系
2. 本地方法栈, jvm 中 c++ 代码的函数调用关系
4. 元数据区(方法区), 代码中涉及到的类信息, 以及类的 static 属性, 静态变量
堆(线程共享)
堆是所有线程共享的, 分为新生代和老生代, 在堆上的 GC 操作在上述的分代算法有介绍
方法区(元数据区) (线程共享)
用来存储被虚拟机加载的类信息、静态变量等数据
Java虚拟机栈(线程私有的)
每个方法在执行的时候都会创建栈帧存储局部变量, 方法出口等等, 常说的堆内存, 栈内存指的就是虚拟机栈
- 局部变量表: 存储方法参数和局部变量
- 操作栈: 每个方法会生成一个先进后出的操作栈
- 动态链接: 指向常量池的方法引用
- 方法返回地址: PC 寄存器的地址
本地方法栈(线程私有)
本地方法栈和虚拟机栈类似, 但是 Java 虚拟机栈是给 jvm 使用的, 本地方法栈是给本地方法使用的
程序计数器(线程私有)
用来记录当前线程执行的行号
当前线程如果执行的是一个 Java 的方法, 这个计数器记录的是正在执行的虚拟机字节码指令的地址; 如果执行的是一个 Native 方法, 计数器的值为空 (因为调用的是其他语言的代码, 计数器并没有意义)
!!! 计数器是唯一一个在 jvm 规范中没有规定任何 OOM 情况的区域 (也就是内存溢出)
相关文章:
JVM的一些知识
JVM简介 JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别: VMw…...
SpringCloud网关:Gateway路由配置与过滤器链
文章目录 引言一、Gateway基本架构二、路由配置方式2.1 配置文件方式2.2 Java代码方式 三、内置断言工厂四、内置过滤器工厂4.1 请求路径相关过滤器4.2 请求和响应头过滤器4.3 功能性过滤器 五、自定义过滤器5.1 自定义GatewayFilter5.2 自定义过滤器工厂 六、全局过滤器总结 引…...
Git 分支使用规范全解(多人协作开发适用)
🚀 Git 分支使用规范全解(多人协作开发适用) 本文将为你梳理一套清晰、标准、适合企业/团队使用的 Git 分支管理策略,适用于前后端、边缘端、AI项目等多种场景。 🧩 为什么要规范分支管理? 防止多人协作混乱、冲突频发清晰区分:开发中 / 待发布 / 已上线 的版本快速定…...
【华三】路由器交换机忘记登入密码或super密码的重启操作
【华三】路由器交换机忘记登入密码或super密码的重启操作 背景步骤跳过认证设备:路由器重启设备翻译说明具体操作 跳过当前系统配置重启设备具体操作 背景 当console口的密码忘记,或者说本地用户的密码忘记,其实这时候是登入不了路由器的&am…...
Linux驱动开发进阶 - 文件系统
文章目录 1、前言2、学习目标3、VFS虚拟文件系统3.1、超级块(Super Block)3.2、dentry3.3、inode3.4、file 4、文件系统的挂载5、文件系统的注册5.1、文件系统的注册过程5.1.2、定义文件系统类型5.1.3、注册文件系统5.1.4、注销文件系统 5.2、文件系统的…...
Mac:JMeter 下载+安装+环境配置(图文详细讲解)
📌 下载JMeter 下载地址:https://jmeter.apache.org/download_jmeter.cgi 📌 无需安装 Apache官网下载 JMeter 压缩包,无需安装,下载解压后放到自己指定目录下即可。 按我自己的习惯,我会在用户 jane 目…...
蓝桥杯备考:图论之Prim算法
嗯。通过我们前面的学习,我们知道了,一个具有n个顶点的连通图,它的生成树包括n-1个边,如果边多一条就会变成图,少一条就不连通了 接下来我们来学一下把图变成生成树的一个算法 Prim算法,我们从任意一个结…...
Linux 文件操作-标准IO函数3- fread读取、fwrite写入、 fprintf向文件写入格式化数据、fscanf逐行读取格式化数据的验证
目录 1. fread 从文件中读取数据 1.1 读取次数 每次读取字节数 < 原内容字节数 1.2 读取次数 每次读取字节数 > 原内容字节数 2.fwrite 向文件中写入数据 2.1写入字符串验证 2.2写入结构体验证 3. fprintf 将数据写入到指定文件 4. fscanf 从文件中逐行读取内容…...
汽车一键启动系统使用方便,舒适出行,轻松匹配
汽车一键启动系统 系统定义 移动管家汽车一键启动系统是装置在智能汽车上的一部分,是实现简约打火和熄火过程的一个按钮装置。它可以在原车钥匙锁头的位置改装,也能独立面板改装,现在很多高低配置的车辆都可安装。 功能特点 基本功能 启…...
python函数的多种参数使用形式
目录 1. 位置参数(Positional Arguments) 2. 关键字参数(Keyword Arguments) 3. 默认参数(Default Arguments) 4. 可变参数(Variable Positional Arguments) 5. 关键字可变参数&…...
Qt带参数的信号和槽,以及信号与槽的连接方式
1.带参数的信号和槽 Qt的信号与槽也支持带有参数,同时也可以支持重载 此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表一致 此时信号触发,调用到槽函数的时候,信号函数中的实参就能够被传递到槽函数的形参中 示例…...
深度解析ECharts.js:构建现代化数据可视化的利器
引言:数据可视化的新时代挑战 在数字化转型浪潮中,数据可视化已成为企业决策和用户体验的关键环节。面对海量数据的呈现需求,传统表格已无法满足用户对直观洞察的渴求。作为百度开源的JavaScript可视化库,ECharts.js凭借其强大的…...
Flutter:页面滚动,导航栏背景颜色过渡动画
记录:导航默认透明,页面发生滚动后,导航背景色由0-1,过渡到白色背景。 view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:redo…...
一文了解ThreadLocal
什么是ThreadLocal? ThreadLocal是每个线程私有的,线程可以把自己的私有数据放到ThreadLocal里面,不用担心其他线程访问到自己ThreadLocal。 通过set()方法将值存入ThreadLocal或者修改值,get()方法取出值,remove()方…...
日常学习开发记录-input组件
实现 1.实现2.inline-table和table-cell实现2.1 表格布局的特性2.2 示例 3.clear清除事件未生效3.1 原因3.2 解决 4. 增加type为text和textarea4.1 rows,autosize的实现 5.拓展-composition事件 1.实现 <template><div class"my-input":class"{is-dis…...
【数据库系统原理】简答题
真题 2024-10 31.数据模型的三大要素是什么? 32.简述关系模型的参照完整性规则。 33.什么是视图?视图的作用是什么? 34.简述两个实体型之间联系的三种形式,并举例说明。 35.什么是数据库备份?MySQL使用什么语句实现备份与恢复数据库中表的数据? 2024-04 31.请解释数据…...
20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3
stty -F /dev/ttyS3 115200 -echo cat /dev/ttyS3 & echo serialdata > /dev/ttyS3 20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3 2025/3/19 14:17 缘起:在荣品的PRO-RK3566开发板的buildroot系统下,在命令…...
C#基于MVC模式实现TCP三次握手,附带简易日志管理模块
C#基于MVC模式实现TCP三次握手 1 Model1.1 ServerModel1.2 ClientModel1.3 配置参数模块1.4 日志管理模块1.4.1 数据结构1.4.1 日志管理工具类1.4.1 日志视图展示1.4.1.1 UcLogManage.cs1.4.1.2 UcLogManage.Designer.cs 2 视图(View)2.1 ViewServer2.1.…...
大语言模型的多垂类快速评估与 A/B 测试
简介 行业领先的模型构建企业携手澳鹏(Appen)开展了一项极具挑战性的项目。针对 3 至 6 个大型语言模型(LLM),在广泛的通用领域及复杂专业领域(如医疗保健、法律、金融、编程、数学和汽车行业等࿰…...
一个成功的Git分支模型
本作品原发布账号为【白鸽子中文网】,现转至当前账号【飞翔中文网】。 反思备录(2020/3/5) 这个模型构思于2010年,现已过去10余年,(2010年)那时正处于Git诞生后不久。在这10年间,git-flow(本文中提到的分支模型) 在许多软件队伍里…...
MySQL 在 CentOS 7 上安装的步骤指南
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1. 卸载不需要的环境 2. 获取 MySQL YUM 仓库 3. 安装 MySQL 4. 启动…...
DeepSeek-R1深度解读
deepseek提出了一种通过强化学习(RL)激励大语言模型(LLMs)推理能力的方法,个人认为最让人兴奋的点是:通过RL发现了一个叫“Aha Moment”的现象,这个时刻发生在模型的中间版本中。在这个阶段&…...
吴恩达机器学习笔记复盘(六)梯度下降算法
简介 梯度下降(Gradient Descent)是一种常用的优化算法,广泛应用于机器学习、深度学习等领域,在这里是用于求J(w,b)局部最小值。 我自己觉得这样说有点过于抽象。换个直观点的说法就是,一个人…...
【环境配置】windows下vscode下无法激活conda环境、创建虚拟环境报错
前言 我的本地的系统,绝大部分是使用的ubuntu。去年下半年开始切换成windows,然后windows下使用vscode还需要注意一些小的配置。为了避免反复搜索,这里记录下。 当已经在 windows 下安装了anaconda、vscode,之后的使用有可能存…...
【Linux笔记】动态库与静态库的理解与加载
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】动态库与静态库的制作 🔖流水不争,争的是滔滔不 一、ELF文件二、ELF的形…...
ollama docker设置模型常驻显存
参考: https://github.com/ollama/ollama/issues/5272 https://deepseek.csdn.net/67cfd7c93b685529b708fdee.html 通过-e传入环境变量,ollama运行: docker run -d --gpusall -e OLLAMA_KEEP_ALIVE-1 -v ollama:/root/.ollama -p 11434:114…...
SAP-ABAP:SAP 主数据管理体系深度解析与学习路径介绍
Ⅰ. 主数据体系全景认知 1.1 主数据核心定位 #mermaid-svg-Lf3tZAfcROs5hlN4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Lf3tZAfcROs5hlN4 .error-icon{fill:#552222;}#mermaid-svg-Lf3tZAfcROs5hlN4 .error-t…...
Redis解决缓存击穿问题——两种方法
目录 引言 解决办法 互斥锁(强一致,性能差) 逻辑过期(高可用,性能优) 设计逻辑过期时间 引言 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对…...
FGPA学习(二)实现LED流水灯
目录 一、6个LED灯实现流水灯 (一)实验逻辑 1、时钟和复位信号的处理 2、按键停止信号的处理 3、计数器的计数逻辑 4、LED 状态更新逻辑 (二)代码实现 (三)效果展示 二、vscode插件下载及其模块分…...
【蓝桥杯】每天一题,理解逻辑(4/90)【Leetcode 二进制求和】
题目描述 我们解析一下题目 我们可以理解到两个主要信息 给的是二进制的字符串返回他们的和 我们知道,十进制的加减法需要进位,例如:9716是因为91之后进了一位,二进制也是如此,只不过十进制是逢10进1,二…...
docker利用ollama +Open WebGUI在本地搭建部署一套Deepseek-r1模型
系统:没有限制,可以运行docker就行 磁盘空间:至少预留50GB; 内存:8GB docker版本:4.38.0 桌面版 下载ollama镜像 由于docker镜像地址,网络不太稳定,建议科学上网的一台服务器拉取ollama镜像&am…...
精准git动图拆解
参考原文:精准git动图拆解 该工具可精准识别并提取.git 动图的每一帧,无论是代码运行演示,还是项目流程展示的动图,都能完美处理。 快速格式转换 提取的动图帧会快速转换为 PNG 格式。PNG 无损压缩、支持透明背景&…...
让vscode远程开发也可以图形显示
目录 0. 摘要1. 保存查看2. jupyter内置inline渲染3. jupyter浏览器4. matplot修改后端5. SSH X11转发[※]6. 参考 0. 摘要 vscode登录远程服务器进行开发遇到图形显示需求时,该怎么处理?一般有几种方式: 保存下来查看jupyter内置的inline图…...
996引擎 - 红点系统
996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…...
Springboot List集合的校验方式
pom.xml 引入 <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.2.0.Final</version></dependency><dependency><groupId>org.springframework.b…...
基于图像识别的医学影像大数据诊断系统的设计与实现
标题:基于图像识别的医学影像大数据诊断系统的设计与实现 内容:1.摘要 随着医学影像技术的快速发展,医学影像数据量呈爆炸式增长,传统的人工诊断方式在处理海量数据时效率低下且容易出现误差。本研究的目的是设计并实现一个基于图像识别的医学影像大数据…...
黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)
文章目录 代码示例效果 代码示例 axiosTest.html <!DOCTYPE html> <!-- 文档类型声明,告诉浏览器这是一个HTML5文档 --> <html lang"en"> <!-- HTML根元素,设置文档语言为英语 --><head> <!-- 头部区域&am…...
PySide(PyQt),使用types.MethodType动态定义事件
以PySide(PyQt)的图片项为例,比如一个视窗的场景底图是一个QGraphicsPixmapItem,需要修改它的鼠标滚轮事件,以实现鼠标滚轮缩放显示的功能。为了达到这个目的,可以重新定义一个QGraphicsPixmapItem类,并重写它的wheelE…...
c语言基础编程入门练习题
[编程入门]成绩评定 题目描述 给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以及90分以上为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。 输入格式 一个整数0-100…...
汽车安全确认等级-中国等保
1、概念解析 网络安全保证等级(Cybersecurity Assurance Level)通常指在不同标准或框架下,根据系统或数据的敏感性、重要性以及潜在风险划分的等级,用于指导组织采取相应的安全防护措施。以下是几个常见的网络安全保证等级体系及…...
Quartus + VScode 实现模块化流水灯
文章目录 一、通过VScode编写Verilog代码二、模块化编程三、代码示例 一、通过VScode编写Verilog代码 1、下载Vscode 2、下载相关插件 搜索Verilog就会弹出有如图所示的插件,下载并安装 3、创建Quartus项目 4、创建完成后点击Tools,选择Options 然后在…...
从两指到三指:Robotiq机器人自适应夹持器技术解析
工业自动化离不开高效工具的支持。Robotiq机器人工具凭借其模块化设计和智能化编程技术,提升了设备的灵活性和操作效率。Robotiq机器人工具精准的传感器和自适应夹持器技术,能够满足多样化的应用需求,为制造业、物流和科研等领域提供可靠的解…...
网络安全应急入门到实战
奇安信:95015网络安全应急响应分析报告(2022-2024年)官网可以下载 https://github.com/Bypass007/Emergency-Response-Notes 应急响应实战笔记 网络安全应急响应技术实战指南 .pdf 常见场景 第4章 勒索病毒网络安全应急响应 第5章 挖矿木…...
Flutter IconButton完全指南:高效使用与性能优化秘籍
目录 一、引言 二、IconButton 的基本用法 三、 进阶技巧 3.1 自定义形状与背景 3.2 带文本的 IconButton(使用 Column 组合) 3.3 自定义交互反馈 3.4 动态图标切换 3.5 组合式按钮(图标 文字) 四、高级应用 4.1 与主题…...
跨国生产制造企业:如何破解远距离数据传输难题?
在全球制造业数字化转型的背景下,跨国生产制造企业的文件传输需求正呈现指数级增长。无论是设计图纸、生产计划、质量控制数据,还是供应链协同信息,跨国文件传输已成为制造业高效运营的核心环节。 然而,制造业文件大数据传输具有文…...
大模型如何赋能安全防御?威胁检测与漏洞挖掘的“AI革命”
🚀 引言:大模型是“安全守护神”还是“双刃剑”? 当黑客用AI生成恶意代码,安全团队也能用大模型“魔法打败魔法”! 划重点:大模型不仅是“生产力工具”,更是安全防御的“智能武器库”࿰…...
uniapp常用组件
写在前面 今天将uniapp中的组件都过了一遍,上手难度不大,但是还是遇到了一些问题: HBuilder实在是太难用,不管是插件生态还是设计之类的,总之就是用的哪哪不顺手虽然打开内置浏览器是挺方便的,但是不知道…...
Oracle OCP认证没落了吗?
Oracle OCP认证没落了吗? Oracle的OCP认证是数据库领域必考的一个认证,但随着国产化的发展,国内很多企业开发了自己的数据库产品,这种情况对很多人造成了错误的认识:OCP被淘汰了吗?不然,从行业需求、技术趋势、认证体…...
洛谷 P3986 斐波那契数列
P3986 斐波那契数列 题目描述 定义一个数列: f ( 0 ) a , f ( 1 ) b , f ( n ) f ( n − 1 ) f ( n − 2 ) f(0) a, f(1) b, f(n) f(n - 1) f(n - 2) f(0)a,f(1)b,f(n)f(n−1)f(n−2) 其中 a, b 均为正整数,n ≥ 2。 问有多少种 (a, b)&…...
使用fastapi部署stable diffusion模型
使用vscode运行stable diffusion模型,每次加载模型都需要10分钟,为算法及prompt调试带来了极大麻烦。使用jupyter解决自然是一个比较好的方案,但如果jupyter由于种种原因不能使用时,fastapi无疑成为了一个很好的选择。 参考github…...