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

JVM知识

JVM

内存模型

JVM的内存模型介绍一下

根据 JVM8 规范,JVM 运行时内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。

JVM的内存结构主要分为以下几个部分:

方法区:存放类对象

Java 虚拟机栈:存放方法之间的调用关系(方法的入口,方法的形参,方法的返回值,局部变量)

本地方法栈:与虚拟机栈类似,区别是虚拟机栈执行java方法,本地方法站执行native方法

程序计数器:存放下一条执行的指令存放的地址

堆内存:所有的对象和数组都在堆上进行分配

JVM内存模型里的堆和栈有什么区别?

用途:栈主要用于存储局部变量、方法调用的参数、方法返回地址以及一些临时数据。

。堆用于存储对象的实例(包括类的实例和数组)。

生命周期

栈中的数据具有确定的生命周期,当一个方法调用结束时,其对应的栈帧就会被销毁,栈中存储的局部变量也会随之消失。

堆中的对象生命周期不确定,对象会在垃圾回收机制(Garbage Collection, GC)检测到对象不再被引用时才被回收。

存取速度

栈的存取速度通常比堆快,因为栈遵循先进后出(LIFO, Last In First Out)的原则,操作简单快速。

堆的存取速度相对较慢,因为对象在堆上的分配和回收需要更多的时间,而且垃圾回收机制的运行也会影响性能。

存储空间

栈的空间相对较小,且固定,由操作系统管理。当栈溢出时,通常是因为递归过深或局部变量过大。

堆的空间较大,动态扩展,由JVM管理。堆溢出通常是由于创建了太多的大对象或未能及时回收不再使用的对象。

栈中存的到底是指针还是对象?

栈中存储的不是对象,而是对象的引用。也就是说,当你在方法中声明一个对象,比如MyObject obj = new MyObject();,这里的obj实际上是一个存储在栈上的引用,指向堆中实际的对象实例。这个引用是一个固定大小的数据(例如在64位系统上是8字节),它指向堆中分配给对象的内存区域。

堆分为哪几部分呢?

Java堆(Heap)是Java虚拟机(JVM)中内存管理的一个重要区域,主要用于存放对象实例和数组。随着JVM的发展和不同垃圾收集器的实现,堆的具体划分可能会有所不同,但通常可以分为以下几个部分:

新生代(Young Generation):新生代分为Eden Space和Survivor Space。在Eden Space中, 大多数新创建的对象首先存放在这里。Eden区相对较小,当Eden区满时,会触发一次Minor GC(新生代垃圾回收)。在Survivor Spaces中,通常分为两个相等大小的区域,称为S0(Survivor 0)和S1(Survivor 1)。在每次Minor GC后,存活下来的对象会被移动到其中一个Survivor空间,以继续它们的生命周期。这两个区域轮流充当对象的中转站,帮助区分短暂存活的对象和长期存活的对象。

老年代(Old Generation/Tenured Generation):存放过一次或多次Minor GC仍存活的对象会被移动到老年代。老年代中的对象生命周期较长,因此Major GC(也称为Full GC,涉及老年代的垃圾回收)发生的频率相对较低,但其执行时间通常比Minor GC长。老年代的空间通常比新生代大,以存储更多的长期存活对象。

方法区 :从Java 8开始,永久代(Permanent Generation)被元空间取代,用于存储类的元数据信息,如类的结构信息(如字段、方法信息等)。元空间并不在Java堆中,而是使用本地内存,这解决了永久代容易出现的内存溢出问题。

大对象区(Large Object Space / Humongous Objects):在某些JVM实现中(如G1垃圾收集器),为大对象分配了专门的区域,称为大对象区或Humongous Objects区域。大对象是指需要大量连续内存空间的对象,如大数组。这类对象直接分配在老年代,以避免因频繁的年轻代晋升而导致的内存碎片化问题。

程序计数器的作用,为什么是私有的?

我们考虑一下,如果在线程切换的过程中,下一条指令执行到哪里了,是不是还是会用到我们的程序计数器啊。每个线程都有自己的程序计数器,因为它们各自执行的代码的指令地址是不一样的呀,所以每个线程都应该有自己的程序计数器。

方法区中的方法的执行过程?

当程序中通过对象或类直接调用某个方法时,主要包括以下几个步骤:

解析方法调用:JVM会根据方法的符号引用找到实际的方法地址(如果之前没有解析过的话)。

栈帧创建:在调用一个方法前,JVM会在当前线程的Java虚拟机栈中为该方法分配一个新的栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

执行方法:执行方法内的字节码指令,涉及的操作可能包括局部变量的读写、操作数栈的操作、跳转控制、对象创建、方法调用等。

返回处理:方法执行完毕后,可能会返回一个结果给调用者,并清理当前栈帧,恢复调用者的执行环境。

方法区中还有哪些东西?

类信息:包括类的结构信息、类的访问修饰符、父类与接口等信息。

常量池:存储类和接口中的常量,包括字面值常量、符号引用,以及运行时常量池。

静态变量:存储类的静态变量,这些变量在类初始化的时候被赋值。

方法字节码:存储类的方法字节码,即编译后的代码。

符号引用:存储类和方法的符号引用,是一种直接引用不同于直接引用的引用类型。

运行时常量池:存储着在类文件中的常量池数据,在类加载后在方法区生成该运行时常量池。

常量池缓存:用于提升类加载的效率,将常用的常量缓存起来方便使用。

String保存在哪里呢?

String 保存在字符串常量池中,不同于其他对象,它的值是不可变的,且可以被多个引用共享。

String s = new String(“abc”)执行过程中分别对应哪些内存区域?

首先,我们看到这个代码中有一个new关键字,我们知道new指令是创建一个类的实例对象并完成加载初始化的,因此这个字符串对象是在运行期才能确定的,创建的字符串对象是在堆内存上。

其次,在String的构造方法中传递了一个字符串abc,由于这里的abc是被final修饰的属性,所以它是一个字符串常量。在首次构建这个对象时,JVM拿字面量"abc"去字符串常量池试图获取其对应String对象的引用。于是在堆中创建了一个"abc"的String对象,并将其引用保存到字符串常量池中,然后返回;

所以,如果abc这个字符串常量不存在,则创建两个对象,分别是abc这个字符串常量,以及new String这个实例对象。如果abc这字符串常量存在,则只会创建一个对象。

引用类型有哪些?有什么区别?

引用类型主要分为强软弱虚四种:

强引用指的就是代码中普遍存在的赋值方式,比如A a = new A()这种。强引用关联的对象,永远不会被GC回收。

弱引用可以用WeakReference来描述,他的强度比软引用更低一点,弱引用的对象下一次GC的时候一定会被回收,而不管内存是否足够。

软引用可以用SoftReference来描述,指的是那些有用但是不是必须要的对象。系统在发生内存溢出前会对这类引用的对象进行回收。

虚引用也被称作幻影引用,是最弱的引用关系,可以用PhantomReference来描述,他必须和ReferenceQueue一起使用,同样的当发生GC的时候,虚引用也会被回收。可以用虚引用来管理堆外内存。

弱引用了解吗?举例说明在哪里可以用?

弱引用的使用场景:

缓存系统:弱引用常用于实现缓存,特别是当希望缓存项能够在内存压力下自动释放时。如果缓存的大小不受控制,可能会导致内存溢出。使用弱引用来维护缓存,可以让JVM在需要更多内存时自动清理这些缓存对象。

对象池在对象池中,弱引用可以用来管理那些暂时不使用的对象。当对象不再被强引用时,它们可以被垃圾回收,释放内存。

内存泄漏和内存溢出的理解?

内存泄露:内存泄漏是指程序在运行过程中不再使用的对象仍然被引用,而无法被垃圾收集器回收,从而导致可用内存逐渐减少

内存泄露常见原因:

静态集合:使用静态数据结构(如HashMap或ArrayList)存储对象,且未清理。

线程未停止的线程可能持有对象引用,无法被回收。

内存溢出:内存溢出是指Java虚拟机(JVM)在申请内存时,无法找到足够的内存,最终引发OutOfMemoryError。这通常发生在堆内存不足以存放新创建的对象时。

内存溢出常见原因:

大量对象创建:程序中不断创建大量对象,超出JVM堆的限制。

递归调用:深度递归导致栈溢出。

jvm 内存结构有哪几种内存溢出的情况?

堆内存溢出:当出现java.lang.OutOfMemoryError:Java heap space异常时,就是堆内存溢出了。原因是代码中可能存在大对象分配,或者发生了内存泄露,导致在多次GC之后,还是无法找到一块足够大的内存容纳当前对象。

栈溢出:如果我们写一段程序不断的进行递归调用,而且没有退出条件,就会导致不断地进行压栈。类似这种情况,JVM 实际会抛出 StackOverFlowError;当然,如果 JVM 试图去扩展栈空间的的时候失败,则会抛出 OutOfMemoryError。

类初始化和类加载

创建对象的过程?

在Java中创建对象的过程包括以下几个步骤:

类加载检查:虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。

分配内存:在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。

初始化零值:内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。

进行必要设置,比如对象头:初始化零值完成之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。这些信息存放在对象头中。另外,根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置方式。

执行 init 方法:在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始——构造函数,即class文件中的方法还没有执行,所有的字段都还为零,对象需要的其他资源和状态信息还没有按照预定的意图构造好。所以一般来说,执行 new 指令之后会接着执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全被构造出来。

对象的生命周期

对象的生命周期包括创建、使用和销毁三个阶段:

创建:对象通过关键字new在堆内存中被实例化,构造函数被调用,对象的内存空间被分配。

使用:对象被引用并执行相应的操作,可以通过引用访问对象的属性和方法,在程序运行过程中被不断使用。

销毁:当对象不再被引用时,通过垃圾回收机制自动回收对象所占用的内存空间。垃圾回收器会在适当的时候检测并回收不再被引用的对象,释放对象占用的内存空间,完成对象的销毁过程。

类加载器有哪些?

启动类加载器(Bootstrap Class Loader):这是最顶层的类加载器,负责加载Java的核心库

扩展类加载器(Extension Class Loader):它是Java语言实现的,继承自ClassLoader类,负责加载扩展库目录,扩展类加载器由启动类加载器加载,并且父加载器就是启动类加载器。

应用程序类加载器(Application Class Loader)负责加载当前项目目录和第三方库目录

这些类加载器之间的关系形成了双亲委派模型,其核心思想是当一个类加载器收到类加载的请求时,首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。

只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

双亲委派模型的作用

保证类的唯一性:通过委托机制,确保了所有加载请求都会传递到启动类加载器,避免了不同类加载器重复加载相同类的情况,保证了Java核心类库的统一性,也防止了用户自定义类覆盖核心类库的可能。

保证安全性:由于Java核心库被启动类加载器加载,而启动类加载器只加载信任的类路径中的类,这样可以防止不可信的类假冒核心类,增强了系统的安全性例如,恶意代码无法自定义一个java.lang.System类并加载到JVM中,因为这个请求会被委托给启动类加载器,而启动类加载器只会加载标准的Java库中的类。

简化了加载流程:通过委派,大部分类能够被正确的类加载器加载,减少了每个加载器需要处理的类的数量,简化了类的加载过程,提高了加载效率。

讲一下类加载过程?

加载:找到.class文件,打开文件,读取文件内容

验证:确保class文件中的字节流包含的信息,符合当前虚拟机的要求

准备:给类对象分配空间

解析:针对类对象中的字符串常量进行处理,进行一些初始化操作

初始化:针对类对象进行初始化

相关文章:

JVM知识

JVM 内存模型 JVM的内存模型介绍一下 根据 JVM8 规范,JVM 运行时内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 JVM的内存结构主要分为以下几个部分: 方法区:存放类对象 Java 虚拟机栈:存放方法之间的调…...

Docker 中多个容器之间的通信

在 Docker 中,多个容器之间的通信可以通过以下几种主要方式实现,具体选择取决于网络需求、隔离性及管理复杂度: 一、自定义 Bridge 网络(推荐) 通过创建自定义的 Docker 网络,容器可以加入同一网络并通过容…...

docker desktop for windows 登录国内镜像仓库

在使用 Docker Desktop for Windows 时,如果你希望连接到国内的 Docker 镜像仓库(例如阿里云、腾讯云等),你可以通过配置 Docker 镜像加速器来实现。以下是一些步骤和示例,帮助你设置 Docker Desktop for Windows 以使…...

【blender小技巧】使用blender的Cats Blender Plugin插件将3D人物模型快速绑定或者修复为标准的人形骨骼

文章目录 前言绑定或者修复人形骨骼1、下载模型2、导入模型到blender中3、删除无用的相机和灯光3、导出模型并在unity中使用 专栏推荐完结 前言 有时候我们下载的3D人物模型,可能不带骨骼信息,或者带一些错乱的骨骼信息。这时候我们就可以使用blender将…...

视频压缩技术学习(不高明版本)

1. 压缩的本质与核心目标​​ 视频压缩的核心在于​​去除冗余信息​​,包括空间冗余(相邻像素相关性)、时间冗余(连续帧相似性)以及视觉冗余(人眼感知特性)。通过算法优化,在保持可…...

在Vue项目中查询所有版本号为 1.1.9 的依赖包名 的具体方法,支持 npm/yarn/pnpm 等主流工具

以下是 在Vue项目中查询所有版本号为 1.1.9 的依赖包名 的具体方法,支持 npm/yarn/pnpm 等主流工具: 一、使用 npm 1. 直接过滤依赖树 npm ls --depth0 | grep "1.1.9"说明: npm ls --depth0:仅显示直接依赖&#xf…...

【Web前端技术】第一节—HTML简介

做出一个属于自己的网站! 云边有个稻草人-个人主页 为你,千千万万遍 ——哈桑 目录 一、网页 1.什么是网页? 2. 什么是 HTML? 3. 网页的形成 二、常用浏览器 1. 常用浏览器 2. 浏览器内核 三、Web标准(重点&…...

LINUX 416 路由转发1

那干脆先配置一下 boot目录必然是标准分区 配路由转发实验 路由器 计划新建3个虚拟机,分别是主机、节点a、节点b,都时间仅主机模式 路由器网卡IP: 节点a路由表 这次装载了附件,桌面安装模式,不用像 最小化安装模式那样折…...

【音视频开发】第四章 SDL音视频渲染

【音视频开发】第四章 SDL音视频渲染 文章目录 【音视频开发】第四章 SDL音视频渲染一、简介1.什么是 SDL 二、Windows 环境搭建三、SDL 子系统四、Window 显示1.SDL 视频显示函数简介2.窗口渲染结构体 五、SDL 事件1.通用事件结构体 SDL_Event2.事件类型 六、SDL 线程1.常用线…...

音频基础概念

声音 物体在一定的振动频率下产生了声音。声音可以被分解为不同频率不同强度正弦波的叠加。 声音三要素 声调 音调: 由发声体振动的频率决定,频率越高(振动越快)则音调越高,听起来就越“刺耳”,反之音调越低、听起…...

rust编程学习(二):复合数据类型

复合数据类型是由其他类型组合而成的类型。Rust的复合数据类型有元组、数组、结构体、枚举等, 通过一些简单的例子帮助大家快速了解Rust复合类型。 1 元组类型 元组类型是由一个或多个类型的元素组合成的复合类型,使用小括号“()”把所有元素放在一起。…...

学习笔记十四——一文看懂 Rust 迭代器

🌀 一文看懂 Rust 迭代器 📚 目录导航 什么是迭代器?为什么 Rust 到处都在用它?Rust 迭代器的底层逻辑是什么?适配器 vs 消费者:谁是主角?常见适配器:加工数据的全能工厂常见消费者…...

H.265硬件视频编码器xk265代码阅读 - 帧内预测

源代码地址: https://github.com/openasic-org/xk265 帧内预测具体逻辑包含在代码xk265\rtl\rec\rec_intra\intra_pred.v 文件中。 module intra_pred() 看起来是每次计算某个4x4块的预测像素值。 以下代码用来算每个pred_angle的具体数值,每个mode_i对应…...

贪心算法学习C++

1,跳跃游戏II 题目连接:45. 跳跃游戏 II - 力扣(LeetCode) 【题目描述】 在给定的一个nums数组中,nums[i]表示从当前i位置最多可以向后跳跃nums[i]个位置。问跳跃到最后 数组最后一个元素的最少跳跃次数?…...

Go 语言实现的简单 CMS Web

Go 语言实现的简单 CMS Web 以下是一个使用 Go 语言实现的简单 CMS Web 演示代码示例, 包含基本的内容管理功能: 项目结构 ### 项目结构 cms-demo/ ├── main.go ├── handlers/ ├── models/ ├── views/ │ ├── home.html │ ├─…...

Zookeeper选举机制

一、选举机制的核心原理 ZooKeeper的选举机制基于ZAB协议(ZooKeeper Atomic Broadcast),这是一种为分布式系统设计的原子广播协议。其核心目标是快速选举出Leader节点,并确保数据一致性。以下为关键原理: 1. 选举触发…...

安卓自定义build的apk文件名

android studio打包应用默认生成的apk名称是:app-release.apk 。 如果我们想修改生成的apk文件名,比如想放入版本号,比如想放入渠道号,又比如和打包时间有关联,那我们就需要能自动化生成可自定义的apk文件名&#xff…...

【Web APIs】JavaScript 操作多个元素 ④ ( 表格全选复选框案例 )

文章目录 一、核心要点解析 - 表格全选复选框案例1、案例需求2、复选框设置3、获取 全选复选框 和 普通复选框4、设置 全选复选框 逻辑5、设置 普通复选框 逻辑 二、完整代码示例1、代码示例2、执行结果 一、核心要点解析 - 表格全选复选框案例 1、案例需求 在表格中 , 设置 多…...

Lua 第6部分 函数

在 Lua 语言中,函数( Function )是对语句和表达式进行抽象的主要方式。 函数既可以用 于完成某种特定任务(有时在其他语言中也称为过程 ( procedure )或子例程 ( s ubroutine) ), 也可以只是进行…...

OpenCv高阶(五)——SIFT特征提取

目录 SIFT特征提取 一、原理核心步骤 1. 尺度空间极值检测 2. 关键点定位 3. 方向分配 4. 描述子生成 二、SIFT算法具有的特点 三、SIFT特征提取器的简单使用 1、特征检测器的创建 2、 检测图像中的关键点 3、绘制关键点 4、计算关键点描述符 四、SIFT 算法的优缺点…...

基于Spring MVC的客户端真实IP获取方案解析

文章目录 基于Spring MVC的客户端真实IP获取方案解析概述核心方法解析代码实现工作流程 IP获取优先级策略IP有效性验证异常处理与日志使用场景注意事项扩展建议 基于Spring MVC的客户端真实IP获取方案解析 概述 在Web应用开发中,准确获取客户端真实IP地址是常见的…...

JavaScript爬虫基础篇:HTTP 请求与响应

在互联网的世界里,数据无处不在。无论是新闻资讯、商品信息,还是社交媒体动态,这些数据都以各种形式存储在服务器上。而爬虫,就是我们获取这些数据的得力助手。今天,我们就来聊聊爬虫的基础——HTTP 请求与响应&#x…...

【Java基础】Java集合遍历方式

前言 在Java编程中,集合(Collection)是存储和操作对象的核心工具。遍历集合是开发者最频繁的操作之一,但不同场景下选择合适的遍历方式至关重要。 一、基础遍历方式 1. 基本for循环 适用场景:仅适用于List等有序集…...

KWDB创作者计划—深度解析:AIoT时代的分布式多模型数据库新标杆

在AIoT(人工智能物联网)快速发展的今天,数据的多样性、实时性和复杂性对数据库提出了前所未有的挑战。传统的数据库架构往往难以同时满足时间序列数据的高效处理、关系型数据的复杂查询以及多模型数据的无缝集成需求。而KWDB 2.2.0版本的发布…...

智慧城市大数据整体建设方案,数据中台方案(word)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章…...

Nginx:轻量级高性能的Web服务器与反向代理服务器

目录 一.引言 二.Nginx的核心特点 2.1高性能与高并发 2.2低资源消耗 2.3功能丰富 2.4高度扩展性 三.Nginx的应用场景 3.1静态资源服务器 3.2反向代理服务器 3.3API网关 3.4Nginx的配置与使用 四.总结 一.引言 在互联网高速发展的今天,Web服务器的性能与…...

【Pandas】pandas DataFrame pop

Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签(行标签和列标签&#…...

Spring Boot集成MinIO的详细步骤

1. 安装MinIO 使用Docker部署MinIO 拉取MinIO镜像: docker pull minio/minio 这将从Docker Hub中获取最新的MinIO镜像。 创建目录: mkdir -p /home/minio/config mkdir -p /home/minio/data 这些目录将用于持久化MinIO的数据和配置文件 创建MinIO…...

【文献笔记】SatLM: Satisfiability-Aided Language Models Using Declarative Prompting

SatLM: Satisfiability-Aided Language Models Using Declarative Prompting 原文代码 标题翻译:SATLM:使用声明式提示的语言模型SAT辅助 1. 简介 1.1. 研究问题 文章提出了SATLM方式,使用LLM生成声明性任务规范,而不是命令式…...

LRU算法

package LRU缓存;import java.util.Arrays; import java.util.HashMap;//建立一个双向队列 class MyQueueNode{int key;int value;MyQueueNode pre;MyQueueNode next;public MyQueueNode(int key,int value){this.key key;this.valuevalue;} } class MyQueue{MyQueueNode head…...

二进制和docker两种方式部署Apache pulsar(standalone)

#作者:闫乾苓 文章目录 1、二进制安装部署Pulsar(standalone)1.1 安装配置JDK1.2 下载解压pulsar安装包1.3 启动独立模式的Pulsar 集群1.4 创建主题测试1.5 向主题写入消息测试1.6 从主题中读取消息测试 2.docker安装部署Pulsar(standalone)2.1 使用docker 启动Pul…...

【物联网】基于LORA组网的远程环境监测系统设计

基于LORA组网的远程环境监测系统设计 演示视频: 简介: 1.本系统有一个主机,两个从机。 2.一主多从的LORA组网通信,主机和两个从机都配备了STM32F103单片机与 LoRa 模块,主机作为中心设备及WIFI网关,负责接收和发送数据到远程物联网平台和手机APP,两个从机则负责采集数…...

k8s+有状态nacos账户密码安全认证开启+springcloud 配置

nacos 账号密码登录,默认未开启验证权限,不登录也能访问nacos控制台配置文件,生产环境非常不安全。所以需要手动开启安全认证。本地启动nacos的 application.properties配置文件更改如下: ### The auth system to use, currently only nacos …...

《分布式软总线赋能老旧设备高效通信》

在数字化转型的浪潮中,分布式软总线技术成为实现设备互联互通的关键力量。然而,当面对大量老旧设备时,其性能受限的现状对分布式软总线提出了严峻挑战。如何在这些性能瓶颈下,让老旧设备实现高效连接与通信,是亟待解决…...

07-云原生安全深度剖析:从 Kubernetes 集群防护到微服务安全加固

云原生安全深度剖析:从 Kubernetes 集群防护到微服务安全加固 一、云原生时代的安全挑战 1.1 云原生架构的复杂性引入新风险 在云原生架构下,Kubernetes 集群管理着大量动态变化的容器化应用,微服务通过 API 频繁交互,传统安全…...

Object.create(null)`和`{}`创建的对象有什么区别?

在 JavaScript 中,使用 Object.create(null) 和 {} 创建的对象有以下核心区别: 1. 原型链的差异 创建方式原型链([[Prototype]])继承关系const obj {}继承自 Object.prototype拥有 Object 的原型方法const obj Object.create(n…...

Sherpa简介

Sherpa 是一个由 K2-FSA 团队 开发的 开源语音处理框架,旨在解决传统语音识别工具(如 Kaldi)在模型部署和跨平台适配中的复杂性问题。它通过整合现代深度学习技术和高效推理引擎,提供了从语音识别、合成到说话人识别的一站式解决方…...

【MySQL】索引事务

索引 1.索引概念 数据库使用select查询需要将表中所有的数据都遍历一遍筛选出满足where条件的,如果表中数据非常多,遍历一遍就需要O(n)复杂度是非常高的,为此就引入了索引的概念。 索引是查询的优化手段,避免对表进行遍历&…...

STL详解 - list

目录 一、List容器概述 1.1 什么是list? 1.2 核心特点 二、List的定义与初始化 三、List 的基本操作 3.1 插入操作 🌵头插和尾插 🌵指定位置插入 3.2 删除操作 🍋头删和尾删 🍋指定位置删除 四、List 的迭代…...

LinkedList<Integer> 常用方法通俗讲解

LinkedList<Integer> linkedList new LinkedList<>(); 创建了一个整数类型的链表。链表就像一列火车&#xff0c;每节车厢(节点)都连接着下一节车厢。下面我用通俗易懂的方式讲解它的主要方法&#xff1a; 1. 添加元素 add(5) - 在链表末尾添加数字5&#xff0c…...

[250416] GitHub Action 新升级,支持 Windows on Arm

目录 GitHub Actions 更新&#xff1a;Windows arm64 托管运行器现已推出公共预览版 GitHub Actions 更新&#xff1a;Windows arm64 托管运行器现已推出公共预览版 现在&#xff0c;GitHub 为公共代码仓库免费提供了基于 Windows arm64 架构的托管运行器&#xff08;Hosted R…...

Spring Boot 整合 Redis 实现点赞功能:从基础到实践

在当今互联网应用开发中&#xff0c;点赞功能几乎成为了各类内容平台的标配。它不仅能增加用户与内容之间的互动&#xff0c;还能直观地反映内容的受欢迎程度。本文将详细介绍如何使用 Spring Boot 整合 Redis 来实现一个简单的文章点赞功能&#xff0c;让你轻松掌握这一实用技…...

深入解析布尔注入:原理、实战与防御

目录 一、布尔注入的原理与核心逻辑 二、布尔注入的实战步骤 三、关键函数与绕过技巧 四、实战案例&#xff1a;获取数据库名称 五、防御策略与最佳实践 六、总结 一、布尔注入的原理与核心逻辑 布尔注入&#xff08;Boolean-Based Blind SQL Injection&#xff09;是一种…...

1.2 使用RawInputSharp来取得键盘硬件信息以及虚拟码

RawInputSharp 是一个 C# 库&#xff0c;用于处理 Windows 的原始输入(Raw Input) API&#xff0c;它允许开发者直接访问键盘、鼠标等输入设备的底层数据。 本例介绍如何读取键盘的虚拟码以及键盘硬件信息。效果如下图&#xff1a; 示例中&#xff1a;开始是1键的按下与抬起&am…...

C++23 中的可选扩展浮点类型:std::float{16|32|64|128}_t 和 std::bfloat16_t

文章目录 1. 扩展浮点类型概述2. 如何使用这些类型3. 编译器支持4. 特性测试宏5. 类型转换和重载决议6. 标准库支持7. 应用场景8. 总结 C23 引入了可选的扩展浮点类型&#xff0c;包括 std::float16_t、 std::float32_t、 std::float64_t、 std::float128_t 和 std::bfloa…...

JVM 内存调优

内存调优 内存泄漏&#xff08;Memory Leak&#xff09;和内存溢出&#xff08;Memory Overflow&#xff09;是两种常见的内存管理问题&#xff0c;它们都可能导致程序执行不正常或系统性能下降&#xff0c;但它们的原因和表现有所不同。 内存泄漏 内存泄漏&#xff08;Memo…...

数据结构(java)栈与队列

栈&#xff1a;&#xff08;先进后出&#xff09; 入栈: 1.普通栈一定要放、最小栈放的原则是: *如果最小栈是空的&#xff0c;那么放 *如果最小栈的栈顶元素没有当前的元素小&#xff0c;则放 2.如果要放的的元素小于等于最小栈栈顶元素可以放吗?放 出栈: 需要…...

医疗大模型落地方案:技术选型、部署策略与调优

医疗大模型的落地应用已成为推动医疗行业数字化转型的重要引擎。本文将从技术选型、部署策略和调优方案三大维度&#xff0c;系统性地解析医疗大模型落地的关键要素&#xff0c;为医疗机构提供可操作的落地指南。随着人工智能技术的快速发展&#xff0c;医疗大模型已在影像诊断…...

JVM:类加载子系统

一、类加载子系统概述 类加载子系统由多个类加载器组成&#xff0c;它们负责从文件系统或者网络中读取二进制形式的字节码&#xff08;.class&#xff09;文件&#xff0c;并将其加载进 JVM。字节码文件中关于类的定义、类中属性的定义、类中方法的定义以及类中方法的字节码等…...

独家!美团2025校招大数据题库

推荐阅读文章列表 2025最新大数据开发面试笔记V6.0——试读 我的大数据学习之路 面试聊数仓第一季 题库目录 Java 1.写一个多线程代码 2.写一个单例代码 3.LinkedBlockingQueue原理 4.模板设计模式 5.如何设计一个 生产者-消费者队列 6.堆内存和栈内存 7.ThreadLo…...