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…...
【安全运营】用户与实体行为分析(UEBA)浅析
目录 用户与实体行为分析(UEBA)简介一、UEBA的核心概念1. 行为基线建立2. 异常检测3. 风险评分4. 上下文关联 二、UEBA的应用场景1. 内部威胁检测2. 外部威胁应对3. 合规性和审计支持 三、UEBA的技术实现1. 大数据技术2. 机器学习算法3. 可视化工具 四、…...
sql小记,20250319
ps:基于sqlserver 一、绩效管理系统表设计 1.表设计 Users用户表:包含id,用户名,密码。 AppraisalBases评价(职位基数)表:包含职位id,职位年终奖基数 AppraisalCoeffcients评价系数表:包含类别id, 类别&…...
C语言每日一练——day_7
引言 针对初学者,每日练习几个题,快速上手C语言。第七天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹
引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…...
C#的简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式是一种创建型设计模式,主要将对象的创建和使用分离,使得系统更加灵活和可维护。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式,以下是 C# 实现的三个案例: 简单工厂模式 简单工厂模式通过一个工厂类来创建…...
用hexo初始化博客执行hexo init时碰到的问题
用hexo初始化博客执行hexo init时碰到的问题 $ hexo init myblog INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git fatal: unable to access https://github.com/hexojs/hexo-starter.git/: SSL certificate problem: unable to get local issuer cer…...
4.1--入门知识扫盲,ISO知识体系介绍(看一遍,协议啥的全部记住)
OSI七层模型:网络世界的"七重天"生存指南(附快递小哥版图解) “如果你觉得网络分层很抽象,那就想象自己在寄快递” —— 来自一个被三次握手逼疯的程序员 开场白:网络通信就像送外卖 假设你要给隔壁妹子送奶…...
AI训练如何获取海量数据,论平台的重要性
引言:数据——AI时代的“新石油” 在人工智能和大模型技术飞速发展的今天,数据已成为驱动技术进步的 “ 燃料 ”。无论是训练聊天机器人、优化推荐算法,还是开发自动驾驶系统,都需要海量、多样化的数据支持。 然而,获…...
Axure高级功能深度解析一一高效原型设计的利器
Axure作为一款专业的原型设计工具,凭借其强大的功能和灵活的交互设计,成为了众多设计师和开发者的首选。本文将深入探讨Axure的高级功能,帮助大家更好地利用这款工具,提升原型设计的效率和质量。 一、Axure高级功能概览 • 变量管…...
QT国产化系统软件开发
一、国产操作系统 1、鸿蒙HarmonyOS NEXT 核心架构 采用自研鸿蒙内核,完全脱离Linux与AOSP代码,基于分布式架构实现跨设备资源虚拟化整合,支持动态调度多终端硬件能力。通过分布式软总线技术(D-Bus)实现低时延…...
Git 使用SSH登陆
一、SSH介绍 SSH连接相比于HTTP连接会简单一点,因为SSH连接通过了私钥与公钥进行身份认证,这样就不需要像HTTP一样,每次clone或者操作仓库都需要输入密码 其中私钥和密钥是需要在自己电脑上生成的,通过命令即可生成一个私钥和一个…...
织梦DedeCMS修改文章【标题、短标题、关键词】长度限制
在后台虽然可以设置标题的长度,但是数据库的字段固定是60个字符,短标题是36字符,关键词30字符,所以这里教大家修改一下织梦DedeCMS修改【标题】【短标题】【关键词】长度限制 一、后台配置 1、进入dede后台管理 -> 系统 ->…...
Powershell WSL部署ubuntu22.04.5子系统
前提条件WSL 安装 wsl 安装参考1wsl 安装csdn参考2wsl 百度网盘离线下载 本地目录安装ubuntu22.04.5 子系统 powershell 管理员打开执行(实现,下载安装ubuntu子系统,用户创建,远程ssh登录设置,防火墙端口开放)子系统IP 查看方法wsl...
umi自带的tailwindcss修改为手动安装
1》为什么改为手动? 主要是为了解决这个报错问题,虽然重新运行也可解决,但是总是要运行2-3次,比较麻烦 2》如何手动 1,先在devDependencies下安装这两个包 pnpm install postcss8.5.1 -D "autoprefixer"…...
Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战
一、问题背景与实现难点 在Android 13横屏设备开发中,系统默认将最近任务列表的"全部清除"按钮布局在屏幕左侧,这与用户习惯的底部布局存在明显差异。相较于Android 8.1时代SystemUI模块的实现,Android 13将相关逻辑迁移至Launche…...
基于k3s部署Nginx、MySQL、SpringBoot和Redis的详细教程
1. 安装k3s集群 1.1 单节点快速部署 # 使用root或sudo权限执行 curl -sfL https://get.k3s.io | sh -# 验证安装 sudo kubectl get nodes # 输出应为Ready状态 sudo systemctl status k3s1.2 配置kubectl权限(可选) mkdir -p ~/.kube sudo cp /etc/r…...
SQL Server数据库简介及应用
SQL Server以高性能、高可用性著称,支持Windows/Linux跨平台部署,满足混合云需求。其内存优化表、列存储索引加速数据处理,AlwaysOn可用性组保障业务连续性。安全体系集成身份验证与加密,符合企业合规要求。与Azure无缝集成&#…...
麒麟V10 arm cpu aarch64 下编译 RocketMQ-Client-CPP 2.2.0
国产自主可控服务器需要访问RocketMQ消息队列,最新的CSDK是2020年发布的 rocketmq-client-cpp-2.2.0 这个版本支持TLS模式。 用默认的版本安装遇到一些问题,记录一下。 下载Releases apache/rocketmq-client-cpp GitHubhttps://github.com/apache/roc…...
【商城实战(49)】解锁小程序端适配与优化,让商城飞起来
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
使用码云搭建CocoaPods远程私有库
一、创建远程私有索引库 用来存放私有框架的详细描述信息.podspec文件 1. 创建私有库 假设码云上创建的私有库为repo-spec 2. 查看本地已存在的索引库 pod repo list 3. 将远程私有索引库添加到本地 pod repo add [https://gitee.com/jingluoguo/repo-spec.git](https://gi…...
深度学习有哪些算法?
深度学习包含多种算法和模型,广泛应用于图像处理、自然语言处理、语音识别等领域。以下是主要分类及代表性算法: 一、基础神经网络 多层感知机(MLP) 最简单的深度学习模型,由多个全连接层组成,用于分类和回…...
专访LayaAir引擎最有价值专家-施杨
在 LayaAir 引擎的资源商店中,许多开发者都会注意到一个熟悉的名字——“射手座”。他不仅贡献了大量高质量的 Shader 资源,让一些开发者通过他的作品了解到 LayaAir 引擎在 3D 视觉效果上的更多可能,也让大家能够以低成本直接学习并应用这些…...
AJAX的理解和原理还有概念
你想问的可能是 AJAX(Asynchronous JavaScript and XML) ,它并不是一门新的编程语言,而是一种在无需重新加载整个网页的情况下,能够与服务器进行异步通信并更新部分网页的技术。以下从基本概念、原理、优点、使用场景等…...
自然语言处理:文本聚类
介绍 大家好,博主又来和大家分享自然语言处理领域的知识了。今天给大家分享的内容是自然语言处理中的文本聚类。 文本聚类在自然语言处理领域占据着重要地位,它能将大量无序的文本按照内容的相似性自动划分成不同的类别,极大地提高了文本处…...
RabbitMQ 集群降配
这里写自定义目录标题 摘要检查状态1. 检查 RabbitMQ 服务状态2. 检查 RabbitMQ 端口监听3. 检查 RabbitMQ 管理插件是否启用4. 检查开机自启状态5. 确认集群高可用性6. 检查使用该集群的服务是否做了断开重连 实操1. 负载均衡配置2. 逐个节点降配(滚动操作…...
uniapp工程中解析markdown文件
在uniapp中如何导入markdown文件,同时在页面中解析成html,请参考以下配置: 1. 安装以下3个依赖包 npm install marked highlight.js vite-plugin-markdown 2. 创建vite.config.js配置文件 // vite.config.js import { defineConfig } fro…...
数据结构:二叉树(一)·(重点)
前言 什么树?what? 树的概念与结构 概念: 树是⼀种⾮线性的数据结构,它是由 n ( n>0 ) 个有限结点组成⼀个具有层次关系的集合。 结构: 有⼀个特殊的结点,称为根结点&#…...
DevEco Studio的使用
目录 1.创建ArkTS工程 2.ArkTS工程目录结构(Stage模型) 构建第一个页面 构建第二个页面 实现页面间的跳转 1.创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择…...
十七、实战开发 uni-app x 项目(仿京东)- 后端指南
前面我们已经用uniappx进行了前端实战学习 一、实战 开发uni-app x项目(仿京东)-规划-CSDN博客 二、实战 开发uni-app x项目(仿京东)-项目搭建-CSDN博客 三、实战开发 uni-app x 项目(仿京东)- 技术选型-CSDN博客 四、实战开发 uni-app x 项目(仿京东)- 页面设计-C…...
