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

【Java ee初阶】jvm(3)

一、双亲委派机制(类加载机制中,最经常考到的问题)

类加载的第一个环节中,根据类的全限定类名(包名+类名)找到对应的.class文件的过程。

JVM中进行类加载的操作,需要以来内部的模块“类加载器”(class loader)

JVM自带了三种类加载器

Bootstrap ClassLoader 负责在Java的标准库中进行查找

ExtensionClassLoader  负责在Java的扩展库中进行查找

ApplicationClassLoader 负责在Java的第三方库/当前项目中进行查找

其中,Java的扩展库是JDK自带的,但是不是标准约定的库,是JDK的厂商自行扩展的功能。现在很少涉及到,一般都是使用第三方库。

Java的官方(Oracle)推出Java的标准文档,其他的厂商就会依据官方的文档,开发对应的JDK(官方确实也开发了JDK,还有一些第三方的,比如知名的OpenJDK,比如知名大厂也会有自己版本的JDK)

不同厂商,都能保证,标准约定的功能都是包含的,并且表现一致。但是这些厂商也会根据需要,扩展出一些功能出来。

这三类加载器之间,存在“父子关系”(不是父类子类,继承关系),每个类加载器中有一个parent这样的属性,保存了自己的父亲是谁。这是在JVM的源码中已经写死的。

双亲委派模型的目的,是为了确保三个类加载的优先级:标准库优先加载,第三方库/当前项目类最后加载。比如自己写一个类,和标准库恰好重复了。java.lang.String。此时JVM保证加载的仍然是标准库的String,而不是你自己写的。

双亲委派模型也是可以打破的。程序员在特定场景下,也可以实现自己的类加载器(实现库/框架 可能涉及到),自己实现的类加载器可以让他遵守,也可以不遵守。

二、JVM的垃圾回收机制 GC

C/C++ 这样的编程语言中,申请内存的时候,是需要用完了手动进行释放的

C 申请内存
1) 局部变量
2) 全局变量 不需要手动释放
3) 动态申请 malloc 通过 free 进行释放的

C++ 申请内存
1) 局部变量
2) 全局变量 / 静态变量
3) 动态申请 new 通过 delete 进行释放

这样的释放操作,容易遗忘(执行不到)就会导致 “内存泄露”

malloc
free

逻辑代码
1) 条件判定 触发 return
2) 抛出异常

很多编程语言,引入了 垃圾回收 机制
不需要程序员写代码手动释放内存,会有专门的逻辑,帮助自动进行释放
垃圾回收,大大的解放了程序员,提高了开发效率

Java, Python, Go, PHP, JS.... 大多数主流语言都包含 GC 功能

为啥 C/C++ 没有引入 GC 呢?
C++ 的设计的核心理念,有两个(C++ 的红线)
1) 和 C 兼容 (C 语言写的代码,用 C++ 编译器可以正常编译运行的)
2) 把性能发挥到极致
隔壁会有很多的技巧 提高 "性能"
++i 代替 i++
通过返回 右值引用 代替返回值对象
通过引用传参代替值传参
通过 constexpr 增加编译期做的工作,减少运行时开销
...................

引入 GC 会影响性能, 引入了额外的运行时开销。
很早之前,C++ 的标准委员会讨论这个事情。
C++ 引入了 "智能指针",可以一定程度的解决内存泄露的问题。(虽然可用性,远不如 GC,总比 C 语言啥都不做,直接摆烂强

在对性能有要求的开发场景中 C++ 是无可替代的
AI
游戏引擎
搜索引擎 (现在 java 性能也赶上来不少,也有 java 实现的版本了...)
交易系统 (股票,基金,外汇,期货...)
操作系统级的开发
...................

挑战者,Rust,尝试挑战 C++ 的生态位
走高性能的路线

主打优势,能够很好的应对内存错误问题
(内存泄露,内存访问越界...)
Rust 通过特殊的语法,在编译期做检查的。
假设代码写出内存泄露,编译通过不了
目前,Rust 发展下来,也变的语法非常复杂了

为什么GC 会影响执行效率?因为触发 GC 的时候,可能会涉及到 STW 问题

stop the world 世界都停止

1. GC 回收的内存区域是哪个部分呢?
IVM
程序计数器
元数据区

堆 => GC 主要回收这个区域

2. GC 的目的是为了释放内存,是以字节为单位“释放”嘛?
不是的,而是以“对象为单位”

正在使用的内存 不回收
不再使用(尚未回收) 不回收
没有使用的区域 回收

按照对象为维度进行回收,更简单方便。
如果是按照“字节维度”,就可能针对每个对象都得描述出哪部分需要回收,哪部分不需要。比较麻烦了。

堆上的内存 => new 的对象

3. 如何回收?
1) 找出垃圾,区分出哪些对象是垃圾(后续代码不再使用)
2) 释放这些垃圾对象的内存

如何“找出垃圾” ?

由于在 Java 中使用对象,都是通过 “引用” 来进行的,使用对象,无非是使用对象的属性/方法,都要通过对象的引用进行。.前面的部分就是指向对象的引用。

如果一个对象已经没有任何引用指向它了,此时这个对象就注定无法被使用了。

判断一个对象是否是垃圾这个问题比较抽象,因此我们将其转换成判断是否有引用指向这个对象,这样子问题就比较具体了。

JVM 内部是有一些办法可以做到的以上这种解决方案的,周大佬 《深入理解 Java 虚拟机》 这本书介绍了两种方案:

*面试的时候,区分好,看面试官是咋问的:
1) 让你介绍下 垃圾回收 中如何判定对象是垃圾的 两个方案都可以介绍
2) 让你介绍 JVM 中如何判定对象是垃圾的 别说引用计数

1) 引用计数(Java 没有使用,Python,PHP... 采用的方案)
简单粗暴的方案。
给每个对象都分配了一个 “计数器”

1. 引用计数 [Java 没有使用,Python,PHP... 采用的方案]
简单粗暴的方案。
给每个对象都分配了一个 “计数器”

Test a = new Test();
Test b = a;
a = null;
b = null;
当引用计数为 0,此时对象就没有任何引用指向了。
对象就是 垃圾了

Python / PHP 等语言
会搭配其他垃圾回收机制,识别当前的引用是否构成循环引用

两个弊端
1) 消耗额外的内存空间较大。
如果对象本身很小(就 4 个字节)
计数器占了俩字节,相当于额外的内存空间多了 50%
2) 循环引用问题 (类似于死锁)

class Test {
    Test t;
}
Test a = new Test();
Test b = new Test();
a.t = b
b.t = a

此时,这俩对象的引用计数是 1,不能释放。
但是,这俩对象却无法通过任何引用来访问到。

AB 相互证明对方不是垃圾
实际上 AB 都是垃圾

以下是图中的文字内容:

```
2. 可达性分析 [Java 使用的方案]
在 Java 代码中,每个 “可访问的对象” 一定是可以通过一系列的引用操作,访问到的。

Node build() {
    Node a = new Node();
    Node b = new Node();
    Node c = new Node();
    Node d = new Node();
    Node e = new Node();
    Node f = new Node();
    Node g = new Node();
    a.left = b;
    a.right = c;
    b.left = d;
    b.right = e;
    e.left = g;
    c.right = f;
    return a;
}

Node root = build();  构建二叉树
此时通过 root 这个引用,是可以访问到这个树上的任何一个对象的


此时通过 root 这个引用,是可以访问到这个树上的任何一个对象的

root => a
root.left => b
root.left.left => d
root.left.right.left => g
...........

假设,写 root.right.right = null
这样的代码会使 f 无法被访问到(f 已经没有引用指向了)

假设,写 root.right = null
这样的代码使 c 不可达。由于 f 必须依赖 c,f 也一起不可达

JVM 安排专门的线程,负责上述的 “扫描” 的过程
会从一些特殊的引用开始扫描 (GC roots)
1. 栈上的局部变量 (引用类型)
2. 常量池里指向的对象 (final 修饰的,引用类型)
3. 元数据区 (静态成员,引用类型)

这三组里可能有很多变量
以这些变量为起点,尽可能的往里访问所有可能被访问到的对象
但凡被访问到的对象,都 “标记为可达”
JVM 又能够知道所有的对象列表,去掉 “标记为可达的”,剩下的就是垃圾了

不引入额外的内存空间
但是需要消耗较多的时间,进行上述扫描过程,这些过程中也是容易触发STW的

(时间换了空间)
另外这里也不会涉及到 “循环引用”

如何释放垃圾 (回收内存)
关于内存回收,涉及到几种算法.

1. 标记 - 清除

标记,就是可达性分析,找到垃圾的过程.
清除,直接释放这部分的内存(相当于直接调用 free / delete 释放这个内存给操作系统)

存在内存碎片问题

总的空闲内存空间,是比较多的 (一共 4MB)
但是这些空闲空间,不连续.

在申请内存的时候,都是在申请连续的内存空间
当尝试申请 2MB 的内存时候,就会申请失败

2. 复制算法解 决内存碎片

把不是垃圾的对象,复制到另外一侧
把整个空间都释放掉

很好的解决了内存碎片问题。
弊端:
1. 内存浪费比较多
2. 如果存活的对象比较多/比较大,复制开销非常明显的

3. 标记 - 整理 类似于顺序表删除元素 - 搬运元素

4. 分代回收 (综合方案), 把上述几个方案,结合起来,扬长避短

整个堆空间,分成 "新生代" "老年代"
年轻对象 年老对象
年龄:一个对象经过垃圾回收扫描线程的轮次

对于年轻对象来说,是容易成为垃圾的。
年老对象,则不容易成为垃圾

可达性分析中,JVM 会不停使用线程扫描这些对象是否是垃圾。每隔一定时间,扫描一次。如果一个对象扫描一次,不是垃圾,年龄就 + 1。一般来说年龄超过 15 (可以配) 的就进入老年代。

"要死早死了"
比如 C 语言,已经存在了 50 年了,可以遇见到这个 C 语言还有很大的希望再活 50 年
> 和 C 语言同时期的 C++ 语言,都死的差不多...

刚创建的新鲜对象放到伊甸区。如果对象活过一轮 GC,进入幸存区。

新对象,大多数是生命周期非常短的 “朝生夕死”,经验规律。这俩幸存区,同一时刻使用一个(相当于复制算法,分出两个部分)。每次经过一轮 GC,都会淘汰掉幸存区中的一大部分对象,把存活的对象和伊甸区中新存活下来的对象,复制算法拷贝到另一个幸存区。新生代非常适合复制算法的。

如果这个对象在新生代中存活多轮之后,就会进入老年代。老年代的对象由于生命周期大概率很长,没有必要频繁扫描。如果这个对象非常大,不适合使用复制算法了。直接进入老年代
老年代回收内存采取的是 标记-清除 / 标记-整理(取决于垃圾回收器的具体实现了)

主流垃圾收集器详解

1.G1垃圾收集器(GarbageFirst)

定位:自Java11起成为默认收集器,是目前最主流的垃圾收集器。

核心特点:

采用分区堆(Region)设计,将堆内存划分为多个大小相等的块(通常为1MB~32MB)。

通过优先回收垃圾最多的Region("GarbageFirst"策略)实现高效回收。

支持大内存(几十GB级别),同时保持可控的STW(StopTheWorld)停顿时间。

2.ZGC垃圾收集器(ZGarbageCollector)

定位:新一代低延迟收集器,未来可能逐步取代G1。

核心特点:

突破性低延迟,STW时间可控制在1ms以内。

同样采用分区堆设计,但通过染色指针(ColoredPointers)和读屏障(LoadBarriers)技术实现并发标记与整理。

支持超大堆内存(TB级别),适合现代高性能应用。

相关文章:

【Java ee初阶】jvm(3)

一、双亲委派机制(类加载机制中,最经常考到的问题) 类加载的第一个环节中,根据类的全限定类名(包名类名)找到对应的.class文件的过程。 JVM中进行类加载的操作,需要以来内部的模块“类加载器”…...

C++ for QWidget:connect(连接)

语法: QObject::connect(发射信号的对象,发射的信号,接收信号的对象,接收后执行的命令) #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui-&g…...

uni-app学习笔记七-vue3事件处理

本文主要用于记录vue3中的点击事件和change事件 点击事件&#xff1a;v-on:click,可简写为click change事件&#xff0c;用于监听值发生改变的的事件处理&#xff1a;change 示例代码&#xff1a; <template><view class"box" click"onClick"…...

【C++进阶篇】C++容器完全指南:掌握set和map的使用,提升编码效率

C容器的实践与应用&#xff1a;轻松掌握set、map与multimap的区别与用法 一. 序列式容器与关联式容器1.1 序列式容器 (Sequential Containers)1.2 关联式容器 (Associative Containers) 二. set系列使用2.1 set的构造和迭代器2.2 set的增删查2.2.1 插入2.2.2 查找2.2.3 删除 2.…...

吴恩达机器学习(1)——机器学习算法分类

1、机器学习算法 1、监督学习 在实际应用中最为常见的快速进度结果 2、非监督学习 2、监督学习&#xff08;Supervised Learning&#xff09; 2.1、回归算法 [!note] 监督学习 是指学习从 x -> y 或者从输入到输出映射的算法 监督学习的关键特征是你给学习算法提供学习…...

我的创作纪念日——512天

2023 年 12 月 19 日&#xff0c;我撰写了第 1 篇记录型博客《数据结构课程设计——报数问题》&#xff0c;这是我记录一段实践经验的开始。 回望那时的自己&#xff0c;还很稚嫩&#xff0c;刚刚迈入计算机的大门不久&#xff0c;一切都显得新鲜而充满挑战。今天是我成为创作者…...

SpringBoot快速上手

1.Maven Maven是项目管理工具&#xff0c;通过pom.xml文件来获取jar包&#xff0c;而不用手动去添加jar包 引入依赖之后需要刷新maven&#xff0c;以下这两个地方都可以 中央仓库 &#xff1a; Central Repository: Maven Repository: Central 2.Spring Boot 2.1创建项目…...

自动化:批量文件重命名

自动化&#xff1a;批量文件重命名 1、前言 2、效果图 3、源码 一、前言 今天来分享一款好玩的自动化脚&#xff1a;批量文件重命名 有时候呢&#xff0c;你的文件被下载下来文件名都是乱七八糟毫无规律&#xff0c;但是当时你下载的时候没办法重名或者你又不想另存为重新重…...

低延迟与高性能的技术优势解析:SmartPlayer VS VLC Media Player

在实时视频流的应用中&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff09;播放器扮演着至关重要的角色&#xff0c;尤其是在视频监控、远程医疗、直播等高实时性需求的场景中。随着行业需求的不断升级&#xff0c;对播放器的低延迟、稳定性、兼容性等方面的…...

java中的Servlet2.x详解

一、Servlet 2.x 版本演进与核心特性 Servlet 2.x 是 Java Web 开发中承上启下的重要版本系列&#xff0c;主要包括 Servlet 2.4 和 Servlet 2.5 两个子版本。以下是其核心特性与改进&#xff1a; Servlet 2.4&#xff08;2003年发布&#xff09; XML Schema 支持&#xff1a;…...

大模型deepseek如何助力数据安全管理

敏感数据识别与处理 精准定位敏感信息 &#xff1a;运用多模态识别引擎技术&#xff0c;快速扫描上传文件与输入内容&#xff0c;精准识别身份证号、银行卡号、商业合同关键信息等各类敏感数据&#xff0c;并支持金融、医疗等行业定制化规则库&#xff0c;满足不同行业的特殊需…...

【linux驱动】【设备树】按键设备树讲解

设备树你添加电源键示例。 / {gpio-keys {compatible = "gpio-keys";#address-cells = <1>;#size-cells = <0>;button@1 {label = "Power Button";linux,code = <KEY_POWER>; // 按键编码,定义在include/uapi/linux/input-event-code…...

Vibe Coding:编程中的氛围与效率的艺术

引言 在软件开发的世界里&#xff0c;我们常常关注语言特性、框架选择和算法效率&#xff0c;却较少讨论一个同样重要的因素——编程时的"氛围"&#xff08;vibe&#xff09;。Vibe Coding是一种关注开发者心理状态、工作环境和整体"感觉"的编程方法论。它…...

算法岗实习八股整理——深度学习篇(不断更新中)

目录 激活函数特征典型例子sigmod函数tanh函数补充&#xff1a;零中心化输出优势非线性特性如何提升神经网络表现 激活函数 特征 非线性&#xff1a;激活函数满足非线性时&#xff0c;才不会被单层网络替代&#xff0c;神经网络才有意义可微性&#xff1a;优化器大多数是用梯…...

Java IO及Netty框架学习小结

Netty netty官网: Netty 什么是Netty&#xff1f; Netty 是 一个异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。Netty 是一个 NIO 客户端服务器框架&#xff0c;可以快速轻松地开发网络应用程序&#xff08;例如协议服务器和客…...

理想AI Talk第二季-重点信息总结

一、TL&#xff1b;DR 理想为什么要做自己的基模&#xff1a;座舱家庭等特殊VLM场景&#xff0c;deepseek/openai没有解决理想的基模参数量&#xff1a;服务端-300B&#xff0c;VLencoder-32B/3.6B&#xff0c;日常工作使用-300B&#xff0c;VLA-4B为什么自动驾驶可以达成&…...

软件架构之-论软件系统架构评估以及应用

论软件系统架构评估以及应用 摘要正文 摘要 2023年2月&#xff0c;本人所在集团公司承接了长三角地区某省渔船图纸电子化审查系统项目开发&#xff0c;该项目旨在为长三角地区渔船建造设计院&#xff0c;以及渔船图纸审查机构提供一个便捷化的服务平台。在此项目中&#xff0c;…...

Java面试实战:从Spring Boot到分布式缓存的深度探索

Java面试实战&#xff1a;从Spring Boot到分布式缓存的深度探索 场景介绍 在一家著名的互联网大厂&#xff0c;面试官老王正对求职者“水货程序员”明哥进行Java技术面试。明哥带着一点紧张和自信&#xff0c;迎接这场技术“拷问”。 第一轮&#xff1a;基础问题 老王&#…...

2025年全国青少年信息素养大赛C++小学全年级初赛试题

一、单选题 1、在C中&#xff0c;表示逻辑运算符 "或" 的是&#xff1f;&#xff08; &#xff09;&#xff08;5 分&#xff09; A&#xff0e;|| B&#xff0e;& C&#xff0e; D&#xff0e; 解析&#xff1a;||是或者&#xff0c; &&是并且 2、…...

React中巧妙使用异步组件Suspense优化页面性能。

文章目录 前言一、为什么需要异步组件&#xff1f;1. 性能瓶颈分析2. 异步组件的价值 二、核心实现方式1. React.lazy Suspense&#xff08;官方推荐&#xff09;2. 路由级代码分割&#xff08;React Router v6&#xff09; 总结 前言 在 React 应用中&#xff0c;随着功能复…...

nginx相关面试题30道

一、基础概念与核心特性 1. 什么是 Nginx&#xff1f;它的主要用途有哪些&#xff1f; 答案&#xff1a; Nginx 是一款高性能的开源 Web 服务器、反向代理服务器及负载均衡器&#xff0c;基于事件驱动的异步非阻塞架构&#xff0c;擅长处理高并发场景。 主要用途&#xff1a;…...

java中的Servlet1.x详解

Servlet 1.x 是 Java Web 开发的早期规范&#xff0c;为后续版本奠定了基础。以下是其核心特性、使用方式及与现代版本的对比分析&#xff1a; 一、Servlet 1.x 的核心特性 基础接口与实现 Servlet 1.x 的核心是 javax.servlet.Servlet 接口&#xff0c;开发者必须直接实现其五…...

给大模型“贴膏药”:LoRA微调原理说明书

一、前言&#xff1a;当AI模型开始“叛逆” 某天&#xff0c;我决定教deepseek说方言。 第一次尝试&#xff08;传统微调&#xff09;&#xff1a; 我&#xff1a;给deepseek灌了100G东北小品数据集&#xff0c;训练三天三夜。结果&#xff1a;AI确实会喊“老铁666”了…但英…...

【数字电路】第七章 脉冲波形的产生与整形电路

一、脉冲波形的产生与整形电路概述 1.矩形脉冲的获得方法 2.矩形脉冲的主要参数 3.本章所涉及的电路 4.稳态与暂稳态 电路的暂稳态实际上是通过RC电路的充放电来实现的。 5.TTL电路输入等效电路 6.TTL电路的输出等效电路 7.CMOS电路的输入等效电路 8.CMOS电路的输出等效电路 …...

React Flow 边的基础知识与示例:从基本属性到代码实例详解

本文为《React Agent&#xff1a;从零开始构建 AI 智能体》专栏系列文章。 专栏地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。项目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代码示​例与实战源&#xff09;。完整介绍…...

DB-MongoDB-00002--Workload Generator for MongoDB

## DB-MongoDB-00002–Workload Generator for MongoDB 1、介绍 Workload Generator for MongoDB was designed to help MongoDB users effortlessly generate data and simulate workloads for both sharded and non-sharded clusters. The generated workloads include s…...

buck变换器的simulink/matlab仿真和python参数设计

什么是Buck电路? BUCK电路是一种降压斩波器&#xff0c;降压变换器输出电压平均值Uo总是小于输出电压UD。通常电感中的电流是否连续&#xff0c;取决于开关频率、滤波电感L和电容C的数值。BUCK也是DC-DC基本拓扑&#xff0c;或者称为电路结构&#xff0c;是最基本的DC-DC电路…...

谷歌地球引擎GEE将多个遥感影像作为多个波段合并成一张图像并下载的方法

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;下载多年的逐日的ERA5土壤湿度数据&#xff0c;并在下载时&#xff0c;将每年同月份内的每一天的图像作为一个波段加以合并的方法。 在之前的文章GEE谷歌地球引擎批量下载逐日…...

Debezium快照事件监听器系统设计

Debezium快照事件监听器系统设计 1. 系统概述 1.1 设计目标 为 Debezium 的快照过程提供可扩展的事件监听机制允许外部系统在快照过程中执行自定义逻辑提供线程安全的事件分发机制确保监听器的异常不会影响主快照流程1.2 核心功能 表快照开始事件监听表快照完成事件监听行数据…...

选择之困:如何挑选合适的 Python 环境与工具——以 Google Colaboratory 为例

引言:选择之困与 Python 的多样性 在过去的十年中,Python 编程语言以其简洁的语法、强大的功能和广泛的适用性迅速崛起,成为全球最受欢迎的编程语言之一。从数据科学到 Web 开发,从自动化脚本到人工智能,Python 无处不在。然而,这种多样性和快速发展也带来了一个显著的问…...

基于Java+MySQL+Servlet的留言系统开发全解析

本系统基于Java Web技术栈开发&#xff0c;采用前后端分离架构&#xff0c;后端通过Servlet实现业务逻辑&#xff0c;前端使用HTML/CSS/JavaScript构建交互界面。本文将详细解析系统设计思路、技术实现与核心代码&#xff0c;助您快速掌握留言系统开发精髓。 一、项目简介 本留…...

实操分享java应用容器化,使用docker作为容器工具

### 一. 目的 将现有的java应用容器化,使用docker作为容器工具。 ### 二. 配置 #### 1. Java应用中的配置 ##### a. Java子项目中的pom文件配置 ```xml <build> <plugins> <plugin> <groupId>org.spring…...

李臻20242817_安全文件传输系统项目报告_第12周

安全文件传输系统项目报告&#xff08;第 9 周&#xff09; 1. 代码链接 Gitee 仓库地址&#xff1a;https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明&#xff1a; project-root/├── src/ # 源代码目录│ ├── main.c # 主程序入口│ ├…...

19-I2C库函数

一、IIC配置流程 IIC配置流程需要添加的库函数&#xff1a;stm32f4xx_i2c.c 1、理解电路原理图 SCL --- PB8 SDA -- PB9 使用I2C1 2、配置I2C库函数的步骤 &#xff08;1&#xff09;使能GPIOB组时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);&#xff08;2…...

minicom串口调试助手

sudo apt-get install minicom 配置 sudo minicom -s 然后用方向键向下移动到“Serial port setup”&#xff0c;回车 按键盘“A”把串口的映射文件名输入。 按键盘“E”可以修改波特率 按键盘“F”把硬件流关闭&#xff0c;否则minicom可能无法接收键盘输入。 配置好后&…...

扫描件交叉合并PDF免费软件 拖拽即合并 + 自动对齐页码 档案整合更轻松

各位办公小能手们&#xff01;我跟你们说啊&#xff0c;今天要给你们介绍个超厉害的工具&#xff0c;叫PDFCrossMerge。这玩意儿就像一个神奇的文档小魔法师&#xff0c;专门搞PDF扫描件交叉合并的事儿&#xff0c;能解决单面扫描文件正反面页码顺序的大难题。 先说说它的核心…...

atcoder C - ~

https://atcoder.jp/contests/abc406/tasks/abc406_c 题目简述&#xff1a; 给定一个序列p&#xff0c;让你求出p的所有子序列中波浪形序列的个数 波浪形序列的定义&#xff1a;1&#xff1a;长度>4&#xff1b;2&#xff1a;仅存在一个波峰和波谷&#xff1b;3&#xff1…...

PCB设计实践(十八)PCB设计铜厚选择及分层设计深度解析

PCB铜箔厚度作为电路板设计的核心参数之一&#xff0c;直接影响电路性能、可靠性及成本。本文将从铜厚选择的六大核心要素、多层板分层设计的策略、制造工艺的耦合关系三大维度&#xff0c;系统性解析PCB铜厚设计的工程方法论&#xff0c;并结合典型应用场景提供决策框架。 一、…...

React 19中如何向Vue那样自定义状态和方法暴露给父组件。

文章目录 前言一、什么是 useImperativeHandle&#xff1f;1.1 为什么需要 useImperativeHandle&#xff1f;1.2 基本语法 二、useImperativeHandle 的常见用法3.1 暴露自定义方法3.2子组件封装的弹窗关闭方法暴露给外部 注意点&#xff1a;总结 前言 在 React 的函数组件中&a…...

【Linux高级全栈开发】2.1.2 事件驱动reactor的原理与实现

【Linux高级全栈开发】2.1.2 事件驱动reactor的原理与实现 高性能网络学习目录 基础内容&#xff08;两周完成&#xff09;&#xff1a; 2.1网络编程 2.1.1多路复用select/poll/epoll2.1.2事件驱动reactor2.1.3http服务器的实现 2.2网络原理 百万并发PosixAPIQUIC 2.3协程库…...

1.5 MouseDown,MouseUp,LostMouseCapture的先后顺序

本文目标是实现如下功能: 按下一个按钮后置位某变量;鼠标松开后复位某个变量? 看似简单,但是一般来说会存在如下两种现象: 鼠标移出按钮:默认会丢失鼠标事件跟踪,即MouseLeftButtonUp事件并不会被触发。 焦点切换:Tab 键切换焦点会干扰按钮的事件捕获 本文通过几个…...

备战!全国青少年信息素养大赛图形化编程-省赛——求最小公倍数

备战&#xff01;全国青少年信息素养大赛图形化编程-省赛——求最小公倍数 题目可点下方去处&#xff0c;支持在线编程~ 求最小公倍数_scratch_少儿编程题库学习中心-嗨信奥 程序演示可点击下方去处&#xff0c;支持源码和素材获取~ 求最小公倍数-scratch作品-少儿编程题库学习…...

Vue3进行工程化项目,保姆级教学(编译软件:vscode)大部分编译平台适用

目录 1. 创建vue工程 1.1 第一步 1.2 选择名称和工件 1.3 选择语言 1.4 自动下载js 1.5 运行vue工程 1.6 成功页面 2. 更改vue工程安装的位置 3. 更改运行工程方式 第一步 第二步 ​编辑 第三步 调试 ​编辑 运行项目 前面所学都是vue3的基础&#xff0c;为了简…...

通过觅思文档项目实现Obsidian文章浏览器在线访问

觅思文档项目开源地址 觅思文档项目开源地址&#xff1a;https://gitee.com/zmister/MrDoc 觅思文档部署步骤概览 服务器拉取代码&#xff1a; git clone https://gitee.com/zmister/mrdoc-install.git && cd mrdoc-install && chmod x docker-install.sh &a…...

⭐️白嫖的阿里云认证⭐️ 第二弹【课时1:提示词(Prompt)技巧】for 「大模型Clouder认证:利用大模型提升内容生产能力」

「大模型Clouder认证:利用大模型提升内容生产能力」这个认证目前在阿里云认证中心还是免费的,简单几步就可以申请考试,有两次的免费考试机会。而且,这个课程中的内容对于所有普通用户来说都非常实用,课程整体长度也就3节课,非常快速就能学完。心动不如行动,赶紧开始吧!…...

零基础搭建!基于PP-ShiTuV2的轻量级图像识别系统(Docker+API部署指南)

以下是对该图像分类识别系统的的简单介绍&#xff1a; PP-ShiTuV2 是一个由百度飞桨团队发布的实用轻量级通用图像识别系统&#xff0c;由主体检测、特征提取、向量检索三个模块构成&#xff0c;适用于快速构建轻量级、高精度、可落地的图像识别应用image_classification是一个…...

阿克曼-幻宇机器人系列教程4- 建图

在之前的文章中&#xff0c;我们介绍了如何登录机器人&#xff0c;如何实现上位机与下位机之间的互通&#xff0c;还介绍了机器人的topic和message&#xff0c;以及如何通过命令行对topic、message进行对应的操作。 接下来&#xff0c;我们就要运用前面所学的所有知识进行综合…...

【方法论】如何构建金字塔框架

文章目录 一、自上而下法1、5步法2、案例说明&#xff1a;基于自上而下法构建金字塔结构来优化写作逻辑 二、自下而上法1、 自下而上法的“三步走”策略步骤1&#xff1a;列出所有思想要点步骤2&#xff1a;找出逻辑关系&#xff08;因果或共性&#xff09;步骤3&#xff1a;得…...

Ubuntu 18.04设置静态IP的方法(图形化操作)

0 前言 当路由器启用了DHCP功能&#xff0c;每次启动虚拟机下的Ubuntu&#xff08;网络连接模式为桥接模式&#xff09;分配到的IP可能是不一样的&#xff0c;不方便使用和调试&#xff08;例如开发板加载镜像的主机IP地址也要跟着更改&#xff09;。针对这些问题&#xff0c;…...

第12章 Java多线程机制

12.1 进程与线程 4种状态&#xff1a;新建、运行、中断和死亡。 &#xff08;新建、运行、中断和死亡&#xff09; 建立线程的两种方法&#xff1a;用Thread类或其子类。 线程新建后&#xff0c;必须调用 start () 方法使其进入就绪队列&#xff0c;才有机会获得 CPU 资源&a…...