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

深入解析 JVM 内存区域及核心概念

深入解析 JVM 内存区域及核心概念

Java 虚拟机(JVM)内部划分了多个内存区域,每个区域存储不同类型的数据并承担不同的职责。本文将详细介绍以下内容:

  • 程序计数器:记录当前线程正在执行的字节码指令及其“行号”信息,附带字节码示例展示其“样子”。

  • JVM 栈:管理方法调用时产生的栈帧,包含局部变量、操作数栈等数据,代码示例展示递归调用导致栈溢出的情形。

  • 本地方法栈:支持 JNI 调用和本地方法执行,虽然一般不用直接操作,但了解其基本概念有助于理解底层实现。

  • Java 堆:所有对象实例存放的主要区域,由垃圾收集器管理。

  • 方法区与运行时常量池:存放类的结构信息、字面量常量、符号引用以及静态变量。我们将通过代码和 javap 命令生成的输出展示常量池的内容。

  • 直接内存:通过 NIO 分配的堆外内存,适用于高性能 I/O 操作。

下面我们逐一介绍各个部分,并给出直观的示例。


1. 程序计数器

1.1 理论说明

程序计数器是一块非常小的内存区域,主要功能是记录当前线程正在执行的字节码指令的地址,相当于程序中的“行号指示器”。它在以下方面起着关键作用:

  • 控制流程:在循环、分支、异常处理等场景下,指明下一条要执行的指令。

  • 线程隔离:每个线程都有独立的程序计数器,因此线程之间互不干扰。

  • 无需垃圾回收:由于体积极小,JVM 不会因程序计数器而抛出 OutOfMemoryError。

1.2 字节码示例

虽然在 Java 代码中无法直接观察程序计数器的变化,但我们可以通过查看编译后的字节码了解其作用。假设有如下简单方法:

public class BytecodeDemo {public void exampleMethod() {int a = 10;int b = 20;int c = a + b;System.out.println(c);}
}

使用 javap -c BytecodeDemo 后可能得到类似如下的字节码(部分输出):

Compiled from "BytecodeDemo.java"
public class BytecodeDemo {public BytecodeDemo();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnpublic void exampleMethod();Code:0: bipush        10        // 将数字 10 压入操作数栈2: istore_1                // 存储到局部变量 13: bipush        20        // 将数字 20 压入操作数栈5: istore_2                // 存储到局部变量 26: iload_1                 // 将局部变量 1 加载到操作数栈7: iload_2                 // 将局部变量 2 加载到操作数栈8: iadd                    // 执行加法运算9: istore_3                // 将结果存储到局部变量 310: getstatic     #2        // Field java/lang/System.out:Ljava/io/PrintStream;13: iload_3                 // 将计算结果加载到操作数栈14: invokevirtual #3        // Method java/io/PrintStream.println:(I)V17: return
}

在这个字节码中,每个数字(如 0、1、2...)就是程序计数器对应的“地址”或指令索引。虽然我们平时无法直接操作,但这正是 JVM 调度字节码时依据的依据。


2. Java 虚拟机栈

2.1 概念解析

当 Java 程序调用方法时,JVM 为该方法分配一个“栈帧(Stack Frame)”。每个栈帧包含:

  • 局部变量表:存储方法参数和局部变量。变量的存储位置称为“槽”(Slot)。

  • 操作数栈:用于存放运算过程中的中间结果。

  • 动态链接信息:用于支持方法调用过程中的符号解析。

  • 返回地址:指明调用结束后应返回的指令位置。

2.2 代码示例:递归调用导致栈溢出

下面的代码展示了递归调用时不断分配栈帧的过程,最终可能导致 StackOverflowError

public class JVMStackDemo {public static void recursiveCall(int depth) {System.out.println("递归深度:" + depth);recursiveCall(depth + 1);}public static void main(String[] args) {try {recursiveCall(1);} catch (StackOverflowError e) {System.err.println("错误:栈溢出,递归调用太深!");}}
}

每次递归调用都会在 JVM 栈中创建一个新的栈帧,当递归深度超过 JVM 所分配的栈内存时,就会抛出栈溢出错误。


3. 本地方法栈

3.1 概念解析

本地方法栈主要用于执行 JNI(Java Native Interface)调用和本地方法(如 C/C++ 代码)。其工作方式与 JVM 栈相似,不同点在于:

  • 服务对象:本地方法栈专门处理本地代码,而 JVM 栈用于执行 Java 字节码。

  • 实现自由:《Java 虚拟机规范》允许各个 JVM 自行实现本地方法栈,部分 JVM 可能将其与 JVM 栈合并。

了解这一部分有助于调试与 JNI 相关的问题,但一般情况下开发者无需直接干预。


4. Java 堆

4.1 概念解析

Java 堆是 JVM 内存中最大的区域,所有通过 new 关键字创建的对象都分配在堆中。堆内存由垃圾收集器管理,当对象不再被引用时,系统会自动回收这些内存。

4.2 代码示例:对象的分配与垃圾回收

public class HeapDemo {static class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}@Overrideprotected void finalize() throws Throwable {System.out.println("回收 Person 对象:" + name);super.finalize();}}public static void main(String[] args) {// 创建大量对象,促使垃圾回收器启动for (int i = 0; i < 100000; i++) {new Person("Person" + i, i);}// 请求垃圾回收(仅建议,实际执行由 JVM 决定)System.gc();System.out.println("对象创建完毕,请查看垃圾回收日志。");}
}

在此示例中,大量 Person 对象被创建并分配在堆中,当它们不再被引用时,垃圾回收器会回收相应内存。


5. 方法区与运行时常量池

5.1 概念解析

方法区存储了 JVM 加载的类信息,包括:

  • 类的结构信息:类的全限定名、父类、接口、字段、方法及修饰符等。

  • 常量:编译期间确定的字面量(如字符串、数字、布尔值)会存入运行时常量池中。

  • 静态变量:类变量在类加载时初始化,并在整个应用中共享。

运行时常量池是方法区的一部分,它保存了:

  • 字面量常量:例如 "HelloWorld"、数字 100 等。

  • 符号引用:在编译期间以符号形式存在,类加载时会解析成直接引用(例如类名、方法名、字段名)。

5.2 代码示例:类结构、常量与静态变量

package com.example;public class MyClass {// 实例字段private int instanceField;// 静态字段(类变量)public static String staticField = "静态变量示例";// 常量(在编译期间确定,并存入运行时常量池)public static final double PI = 3.14159;public MyClass(int instanceField) {this.instanceField = instanceField;}public void display() {System.out.println("实例字段:" + instanceField);}public static void printStatic() {System.out.println("静态字段:" + staticField);}
}

在这个示例中:

  • 类的结构信息:包括类名 com.example.MyClass、字段 instanceFieldstaticField 以及方法。

  • 常量PI 作为 final 修饰的常量,其值在编译期确定,并存入运行时常量池中。

  • 静态变量staticField 在类加载时分配,所有实例共享该变量。

5.3 运行时常量池的直观展示

你可以使用 javap -v MyClass 命令查看类的详细信息,其中会列出常量池的内容。部分输出示例如下:

Constant pool:#1 = Methodref          #7.#17         // java/lang/Object."<init>":()V#2 = String             "静态变量示例"#3 = Float              3.14159f#4 = Utf8               MyClass#5 = Utf8               instanceField...

这些条目显示了类中存在的各种字面量、符号引用等信息,是 JVM 在加载类时用来解析并建立直接引用的重要依据。


6. 直接内存

6.1 概念解析

直接内存并非 JVM 内部数据区的一部分,但常用于高性能 I/O 操作。它通过 NIO 类库直接从操作系统分配内存,可以减少数据在 Java 堆和本地内存之间的复制开销。

说明:

NIO 是 “New I/O” 的缩写,它是 Java 在 JDK 1.4 中引入的一套全新的 I/O API,相对于传统的基于流(Stream)的 I/O 模型,NIO 提供了以下几个显著的特点:

  • 缓冲区(Buffer):NIO 采用缓冲区来处理数据,数据的读写都是通过缓冲区进行的,这样可以更高效地管理内存。

  • 通道(Channel):与传统的 I/O 流不同,通道可以用于读写数据,它支持双向传输,可以同时进行读和写操作。

  • 选择器(Selector):支持非阻塞 I/O,允许单个线程同时监控多个通道的状态,从而实现高效的 I/O 多路复用。

  • 内存映射文件(Memory-mapped File):可以将文件直接映射到内存,进一步提高 I/O 性能。

6.2 代码示例:使用 NIO 分配直接内存

import java.nio.ByteBuffer;public class DirectMemoryDemo {public static void main(String[] args) {// 分配 1024 字节的直接内存ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024);System.out.println("直接内存容量:" + directBuffer.capacity() + " 字节");// 向直接内存写入数据for (int i = 0; i < 10; i++) {directBuffer.put((byte) i);}// 翻转缓冲区以便读取directBuffer.flip();System.out.print("直接内存数据:");while (directBuffer.hasRemaining()) {System.out.print(directBuffer.get() + " ");}System.out.println();}
}

以上示例展示了如何分配并操作直接内存,从而避免频繁在 Java 堆和本地内存之间复制数据。


相关文章:

深入解析 JVM 内存区域及核心概念

深入解析 JVM 内存区域及核心概念 Java 虚拟机&#xff08;JVM&#xff09;内部划分了多个内存区域&#xff0c;每个区域存储不同类型的数据并承担不同的职责。本文将详细介绍以下内容&#xff1a; 程序计数器&#xff1a;记录当前线程正在执行的字节码指令及其“行号”信息&a…...

字节跳动春招研发部笔试题解

字节跳动春招研发部笔试题 1.万万没想到之聪明的编辑 我叫王大锤&#xff0c;是一家出版社的编辑。我负责校对投稿来的英文稿件&#xff0c;这份工作非常烦人&#xff0c;因为每天都要去修正无数的拼写错误。但是&#xff0c;优秀的人总能在平凡的工作中发现真理。我发现一个发…...

java对象模型

java对象自身的存储模型JVM会给这个类创建一个instanceKlass&#xff0c;保存在方法区&#xff0c;用来在JVM层表示该Java类。 a类。当我们在Java代码中&#xff0c;使用new创建一个对象的时候&#xff0c;JVM会在栈中给对象赋值&#xff0c;会在堆中创建一个instanceOopDesc对…...

深入理解指针(3)(C语言版)

文章目录 前言 一、字符指针变量二、数组指针变量2.1 数组指针变量是什么2.2 数组指针变量怎么初始化2.2.1 静态初始化2.2.2 动态初始化 三、二维数组传参的本质四、函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 typedef关键字4.4拓展 五、函数指针数组六、转…...

Linux内核 内存管理 物理内存初始化流程

1.‌ARM64页表初始化流程图 start_kernel()│▼ setup_arch() // 架构相关初始化│▼ early_fixmap_init() // 初始化Fixmap&#xff08;临时映射设备树等&#xff09;│▼ arm64_memblock_init() // 从设备树解析内存布局│▼ arm…...

Day23:和为s的数字

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况&#xff0c;返回任一结果即可。 示例 1&#xff1a; 输入&#xff1a;price [3, 9, 12, 15], target 18 输出&#xff1a;[3,15] 或者 [15,3]示例 2&#x…...

Transformer 通关秘籍2:利用 BERT 将文本 token 化

前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的&#xff0c;希望你可以对此有一个感性的认识。 本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程&#xff0c;这个过程被称为分词&#xff0c;也叫 tokenization。 在你没了解这方面…...

电脑干货:万能驱动--EasyDrv8

目录 万能驱动EasyDrv8 功能介绍 主程序界面 驱动解压与安装 PE环境支持 系统部署环境 桌面环境一键解决方案 万能驱动8电脑版是由IT天空出品的一款智能识别电脑硬件并自动安装驱动的工具&#xff0c;一般又称为it天空万能驱动&#xff0c;万能驱动vip版&#xff0c;简称…...

18502 字符串哈希匹配字符串

18502 字符串哈希匹配字符串 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;字符串hash &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int…...

openmmlab介绍 一下

OpenMMLab 是由商汤科技&#xff08;SenseTime&#xff09;发起并维护的开源深度学习项目&#xff0c;专注于计算机视觉领域。它提供了一系列模块化、可扩展的工具库&#xff0c;旨在帮助研究者和开发者高效地实现、复现和部署前沿的视觉算法。OpenMMLab 的设计强调‌模块化‌、…...

基于javaweb的SpringBoot线上网络文件管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

【设计模式】工厂模式详解-----简单工厂模式、工厂方法模式、抽象工厂模式

工厂模式详解 一、概述 工厂模式&#xff08;Factory Pattern&#xff09; 是一种 创建型设计模式&#xff0c;用于 封装对象的创建逻辑&#xff0c;避免在代码中直接实例化对象&#xff0c;从而提高代码的 可维护性、扩展性和解耦性。 二、工厂模式分类 工厂模式包括 简单工…...

【雅思播客09】Turn Left here.

Hello everyone! And welcome to my channel! Im Reevs. Good morning! 大家好&#xff0c;欢迎来到懒人英语晨读栏目&#xff0c;我是Reevs&#xff0c;早上好呀。 I have a great lesson for you today. 今天我有一堂非常棒的课。 We have an elementary lesson, which is …...

初阶7 vector

本章重点 vector的介绍vector的使用vector的模拟实现 1.vector的介绍 vector就类似数据结构中的顺序表 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。 意味着可以采用下标对vector的元素 进行访问&#xff0c;和数…...

归并排序总结

归并排序是分治法的典型应用&#xff0c;把两个或k个有序的子序列合并为一个。2路归并&#xff0c;2合一。k路归并&#xff0c;k合一。内部排序通常采用2路归并排序&#xff0c;先将数组分成两半&#xff0c;分别排序&#xff0c;然后合并。合并的过程需要将两个有序的子数组合…...

ollama迁移已下载的单个模型到服务器

ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的&#xff0c;部署和运行都很简单&#xff0c;是否高效就另说了。但最起码&#xff0c;他能充分利用用户的硬件设备&#xff0c;在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的&#xf…...

基于SSM+Vue物流信息管理系统(附源码)

预览页面 获取方式 https://gitee.com/XiaoLin_Java/communion/blob/master/README.en.md...

docker创建registry镜像仓库2.8版本

目录 shell脚本内容 运行效果 问题与解决 涉及镜像包registry:2.8&#xff08;x86版本&#xff09; shell脚本内容 [roottest1 docker]# cat registry.sh #!/bin/bash read -p "请输入用户:" user read -p "请输入密码:" passpathpwd passdir"$…...

Ubuntu下用QEMU模拟运行OpenBMC

1、前言 在调试过程中&#xff0c;安装了很多依赖库&#xff0c;具体没有记录。关于kvm&#xff0c;也没理清具体有什么作用。本文仅记录&#xff0c;用QEMU成功的将OpenBMC跑起来的过程&#xff0c;做备忘&#xff0c;也供大家参考。 2、环境信息 VMware Workstation 15 Pro…...

Unity Shader编程】之复杂光照

在Unity Shader的LightMode标签中&#xff0c;除了前向渲染和延迟渲染外&#xff0c;还支持多种渲染模式设置。以下是主要分类及用途&#xff1a; 一、核心渲染路径模式 前向渲染相关 ForwardBase 用于基础光照计算&#xff0c;处理环境光、主平行光、逐顶点/SH光源及光照贴图。…...

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.3前馈网络(FFN)与激活函数(GELU)优化

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.3 前馈网络(FFN)与激活函数(GELU)优化1. 前馈网络(FFN)的架构设计与数学原理1.1 FFN在Transformer中的核心作用2. GELU激活函数的数学特性与优化2.1 GELU的数学形式与近似计算3. 逐行代码实现…...

STM32 MODBUS-RTU主从站库移植

代码地址 STM32MODBUSRTU: stm32上的modbus工程 从站 FreeModbus是一个开源的Modbus通信协议栈实现。它允许开发者在各种平台上轻松地实现Modbus通信功能&#xff0c;包括串口和以太网。FreeMODBUS提供了用于从设备和主站通信的功能&#xff0c;支持Modbus RTU和Modbus TCP协…...

计算机是如何工作的

目录 冯诺依曼体系 CPU基本工作流程&#xff1a; 逻辑门 门电路 算术逻辑单元 ALU&#xff08;Arithmetic&LogicUnit&#xff09; 算术单元(Arithmetic Unit) 逻辑单元(Logic Unit) ALU符号 寄存器(Register)和内存(RAM) 控制单元 CU(Control Unit) 指令(Instruc…...

Arduino、ESP32驱动GUVA-S12SD UV紫外线传感器(光照传感器篇)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 UV紫外线传感器是一个测试紫外线总量的最佳传感器,它不需要使用波长滤波器,只对紫外线敏感。 Arduino UV紫外线传感器,直接输出对应紫外线指数(UV INDEX)的线性电压,输出电压范围大约0~1100mV(对应UV INDEX值…...

【NLP 48、大语言模型的神秘力量 —— ICL:in context learning】

目录 一、ICL的优势 1.传统做法 2.ICL做法 二、ICL的发展 三、ICL成因的两种看法 1.meta learning 2.Bayesian Inference 四、ICL要点 ① 语言模型的规模 ② 提示词prompt中提供的examples数量和顺序 ③ 提示词prompt的形式&#xff08;format&#xff09; 五、fine-tune VS I…...

面向对象软件工程实践软件案例

智力运动-数字化思维训练课程介绍 数字化思维训练是科技赋能素质教育创新实践项目&#xff0c;通过数字化信息化手段&#xff0c;深度融合优质原创智力运动教育课程资源&#xff0c;服务幼儿园与小学&#xff0c;提供信息时代校园素质教育教学解决方案。在《面向对象软件工程》…...

PX4飞控-接收MAVLINK消息(2)-生成MAVLINK_MSG_ID_***.h文件

我在自制的底板上跑vxworks操作系统中移植了MAVLINK的C库用来与PX4飞控进行通信&#xff0c;其中使用的C库和其他依赖文件&#xff0c;例如common文件夹均为从飞控源码中获取&#xff0c;文件获取位置为px4-Autopolite/bulid/mavlink中&#xff0c;因为PX4源码中自带MAVLINK的依…...

Spring Boot 连接 MySQL 配置参数详解

Spring Boot 连接 MySQL 配置参数详解 前言参数及含义常用参数及讲解和示例useUnicode 参数说明&#xff1a; 完整配置示例注意事项 前言 在 Spring Boot 中使用 Druid 连接池配置 MySQL 数据库连接时&#xff0c;URL 中 ? 后面的参数用于指定连接的各种属性。以下是常见参数…...

【数据结构】_单链表_相关面试题(二)

本章重点 hello友友们~ 今天我们将对单链表的后半部分的相关面试题进行详细解析&#xff0c;下面就跟着我一起开启吧~ really GO&#xff01; 1.相交链表 题目&#xff1a; 输入两个链表&#xff0c;找出它们的第一个公共结点。 代码分析&#xff1a; //找到相交结点&#xf…...

深入理解指针(2)(C语言版)

文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参的本质四、冒泡排序五、二级指针六、指针数组七、指针数组模拟二维数组总结 前言 在上一篇文章中&#xff0c;我们初步了解了指针的基本概念和用法。今天&#xff0c;我们将继续深入探索指针在数组、函数传…...

二叉树相关算法实现:判断子树与单值二叉树

目录 一、判断一棵树是否为另一棵树的子树 &#xff08;一&#xff09;核心思路 &#xff08;二&#xff09;代码实现 &#xff08;三&#xff09;注意要点 二、判断一棵树是否为单值二叉树 &#xff08;一&#xff09;核心思路 &#xff08;二&#xff09;代码实现…...

redux ,react-redux,redux-toolkit 简单总结

Redux、React-Redux 和 Redux Toolkit 是协同工作的三个库&#xff0c;各自承担不同角色&#xff0c;相互协同。 Redux&#xff1a;基础底座 底层状态管理库&#xff0c;负责状态存储、Action 派发和 Reducer 执行 ​React-Redux&#xff1a;连接 React 组件与 Redux Store 通…...

5. 实现一个中间件

原文地址: 实现一个中间件 更多内容请关注&#xff1a;php代码框架 理解中间件 中间件&#xff08;Middleware&#xff09; 是一种在请求被路由到控制器方法之前或响应返回客户端之前执行的代码。它通常用于处理通用任务&#xff0c;如身份验证、日志记录、CORS 处理等。 在…...

数据库理论基础

数据库理论基础 1.1 什么是数据库 数据&#xff1a; 描述事物的符号记录&#xff0c; 可以是数字、 文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 数据库&#xff1a; 存储数据的仓库&#xff0c;是长期存放在…...

STM32学习笔记之振荡器(原理篇)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

SQL Server安装程序无法启动:系统兼容性检查失败

问题现象&#xff1a; 运行 SQL Server 2022 安装程序时&#xff0c;提示 “硬件或软件不满足最低要求”&#xff0c;安装向导直接退出或无法继续。 快速诊断 操作系统版本检查&#xff1a; # 查看 Windows 版本&#xff08;需 20H2 或更高&#xff09; winver 支持的系统&…...

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持&#xff0c;其中包括两个重要的函数&#xff1a;std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…...

树形结构的工具类TreeUtil

这个地方是以null为根节点&#xff0c;相关以null或者0自己在TreeUtil中加代码&#xff0c;就行 基础类 package com.jm.common.entity;import lombok.Data;import java.util.ArrayList; import java.util.List;/*** Author:JianWu* Date: 2025/3/26 9:02*/ Data public clas…...

【零基础入门unity游戏开发——2D篇】2D物理系统 —— 2D刚体组件(Rigidbody2D)

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...

人员进出新视界:视觉分析算法的力量

视觉分析赋能离岗检测新策略 随着时代的发展&#xff0c;失业率增加&#xff0c;社会安保压力也随之增大。企业为了提升管理效率&#xff0c;保障园区安全&#xff0c;对员工离岗检测的需求日益迫切。传统的离岗管理方式&#xff0c;如人工巡逻、打卡记录等&#xff0c;不仅效率…...

LabVIEW液压振动锤控制系统

在现代工程机械领域&#xff0c;液压振动锤的高效与精准控制日益显得重要。本文通过LabVIEW软件&#xff0c;展开液压振动锤启停共振控制技术的研究与应用&#xff0c;探讨如何通过改进控制系统来优化液压振动锤的工作性能&#xff0c;确保其在复杂工况下的稳定性与效率。 ​ …...

Slidev使用(一)安装

文章目录 1. **安装位置**2. **使用方式**3. **适用场景**4. **管理和维护** 全局安装1. **检查 Node.js 和 npm 是否已安装**2. **全局安装 Slidev CLI**3. **验证安装是否成功**4. **创建幻灯片文件**5. **启动 Slidev**6. **实时编辑和预览**7. **构建和导出&#xff08;可选…...

浙大:DeepSeek技术溯源及前沿探索

浙江大学DS系列专题《DeepSeek技术溯源及前沿探索》由朱强教授主讲&#xff0c;内容主要包括 语言模型、Transformer、ChatGPT、DeepSeek及新一代智能体 等核心主题。 下载方式&#xff1a;关注“渡江客涂鸦板”&#xff0c;回复ds1253免费获取下载地址 语言模型&#xff1a;语…...

【八股】未知宽高元素水平垂直居中的三种方法

在笔试/面试中&#xff0c;经常出现的一个问题就是&#xff1a;如何实现元素水平垂直居中&#xff1f; 本文会直接使用代码&#xff0c;介绍未知宽高元素水平垂直居中的三种方法&#xff1a; 方法一&#xff1a;绝对定位absolute //绝对定位&#xff0c;将元素的左右位置设置…...

23种设计模式-中介者(Mediator)设计模式

中介者设计模式 &#x1f6a9;什么是中介者设计模式&#xff1f;&#x1f6a9;中介者设计模式的特点&#x1f6a9;中介者设计模式的结构&#x1f6a9;中介者设计模式的优缺点&#x1f6a9;中介者设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…...

(免费开源)图片去水印以及照片擦除功能,你会选择使用吗?

图片去水印以及相关人物擦除是一个非常小众的需求&#xff0c;就是将原本图片上的文字或者logo去除让变成一个干净的图片&#xff0c;但市面上很多都是付费的&#xff0c;今天就介绍一下这款免费工具。 工具演示效果 工具介绍 名称&#xff1a;lama-projct 利用AI模型训练LaM…...

Rust 学习笔记(一)

本文是博主学Rust的学习笔记&#xff0c;将学习经历整理下来&#xff0c;学习接收的内容更加条理且以便回顾。 参照学习资料为Rust官方文档&#xff0c;如内容中有误还请指点&#xff08;一般没有☺&#xff09; 一. 项目搭建 1.创建项目 cargo new hello_cargo cd hello_c…...

C++vector常用接口和模拟实现

C中的vector是一个可变容量的数组容器&#xff0c;它可以像数组一样使用[]进行数据的访问&#xff0c;但是又不像C语言数组空间是静态的&#xff0c;它的空间是动态可变的。 在日常中我们只需要了解常用的接口即可&#xff0c;不常用的接口查文档即可。 1.构造函数 //空构造…...

AI数据分析:一键生成数据分析报告

作为一名数据分析师&#xff0c;我们经常需要做一些数据分析报告&#xff0c;今天我就来手把手教你如何使用大模型一键生成高质量的数据分析报告&#xff0c;提高你的工作效率。 假设你是一家新零售企业的销售分析师&#xff0c;有一份销售数据&#xff0c;数据结构如数据结构…...

leetcode 2829. k-avoiding 数组的最小总和 中等

给你两个整数 n 和 k 。 对于一个由 不同 正整数组成的数组&#xff0c;如果其中不存在任何求和等于 k 的不同元素对&#xff0c;则称其为 k-avoiding 数组。 返回长度为 n 的 k-avoiding 数组的可能的最小总和。 示例 1&#xff1a; 输入&#xff1a;n 5, k 4 输出&…...