JVM 与云原生的完美融合:引领技术潮流
最近佳作推荐:
Java 大厂面试题 – 揭秘 JVM 底层原理:那些令人疯狂的技术真相(New)
Java 大厂面试题 – JVM 性能优化终极指南:从入门到精通的技术盛宴(New)
Java 大厂面试题 – JVM 深度剖析:解锁大厂 Offe 的核心密钥(New)
Java大厂面试高频考点|分布式系统JVM优化实战全解析(附真题)(New)
Java大厂面试题 – JVM 优化进阶之路:从原理到实战的深度剖析(2)(New)
Java大厂面试题 – 深度揭秘 JVM 优化:六道面试题与行业巨头实战解析(1)(New)
开源架构与人工智能的融合:开启技术新纪元(New)
开源架构的自动化测试策略优化版(New)
开源架构的容器化部署优化版(New)
开源架构的微服务架构实践优化版(New)
开源架构中的数据库选择优化版(New)
开源架构学习指南:文档与资源的智慧锦囊(New)
个人信息:
微信公众号:开源架构师
微信号:OSArch
我管理的社区推荐:【青云交技术福利商务圈】和【架构师社区】
2025 CSDN 博客之星 创作交流营(New):点击快速加入
推荐青云交技术圈福利社群:点击快速加入
JVM 与云原生的完美融合:引领技术潮流
- 引言
- 正文
- 一、JVM 在容器化环境中的性能突破
- 1.1 容器资源限制下的 JVM 内存优化
- 1.2 容器快速启停与 JVM 启动时间优化
- 二、JVM 与微服务架构的协同优化
- 2.1 微服务通信中的 JVM 性能提升
- 2.2 微服务治理与 JVM 监控
- 三、JVM 在 Serverless 场景下的创新应用
- 3.1 Serverless 架构对 JVM 的新要求
- 3.2 JVM 在 Serverless 场景下的实践案例
- 结束语
- 🎯欢迎您投票
引言
亲爱的技术爱好者们!大家好!在数字化浪潮汹涌澎湃的当下,云原生早已从概念走向实践,成为驱动软件开发与部署变革的核心力量。而 Java 虚拟机(JVM)作为 Java 技术栈的灵魂中枢,正以其强大的适应性与创新性,深度融入云原生架构体系。这场 JVM 与云原生的 “双向奔赴”,不仅重塑了应用开发、部署和运维的模式,更为技术发展开辟了全新的赛道。今天,就让我们凭借多年深耕技术领域的经验,一同抽丝剥茧,探寻 JVM 与云原生融合背后的技术密码,看看它们是如何携手引领技术潮流的!
正文
一、JVM 在容器化环境中的性能突破
1.1 容器资源限制下的 JVM 内存优化
在容器化的世界里,“寸土寸金” 是资源分配的真实写照。每个容器都被分配了固定的 CPU、内存等资源,这与 JVM 以往 “相对自由” 的运行环境大不相同。传统 JVM 默认的内存分配策略,在容器资源受限的场景下,就像一个不懂节制的 “购物狂”,很容易导致内存溢出等问题。
为了让 JVM 在容器中 “量入为出”,我们需要精准调控它的 “内存钱包”。通过-Xmx
和-Xms
参数,我们可以牢牢把控 JVM 堆内存的上限与初始值。例如,在一个基于 Spring Boot 开发的电商订单服务容器中,根据压测数据和容器可分配的 2GB 内存资源,我们可以这样配置 JVM 参数:
// 设置JVM堆内存最大值为1.4GB(2GB的70%),避免因内存申请过多导致容器OOM
// 同时将初始值设为与最大值相同,减少堆内存动态扩展带来的性能开销
java -Xmx1400m -Xms1400m -jar order-service.jar
除了参数调整,JVM 的分层编译技术也在容器环境中发挥着 “智慧大脑” 的作用。C1 编译器如同一位 “快手达人”,擅长快速编译代码,适合在应用启动阶段快速生成可执行代码,让服务能在最短时间内 “开门营业”;C2 编译器则像一位 “工艺大师”,专注于对热点代码进行深度优化,在应用稳定运行后,将核心业务逻辑的执行效率推向新高度。
我们可以通过以下代码示例,感受热点代码在 C2 编译器优化下的性能提升。假设我们有一个计算斐波那契数列的方法:
public class Fibonacci {// 计算斐波那契数列的方法,n表示数列的项数public static int fibonacci(int n) {if (n <= 1) {return n;}return fibonacci(n - 1) + fibonacci(n - 2);}public static void main(String[] args) {long startTime = System.currentTimeMillis();// 多次调用fibonacci方法,使其成为热点代码for (int i = 0; i < 10000; i++) {fibonacci(30);}long endTime = System.currentTimeMillis();System.out.println("执行时间:" + (endTime - startTime) + "毫秒");}
}
在 JVM 运行过程中,C2 编译器会识别出频繁调用的fibonacci
方法,对其进行优化,显著缩短执行时间。
为了更直观地展示 JVM 内存使用情况与容器资源的关系,我们用以下图表展示:
从图表中可以清晰看到,JVM 堆内存是容器总内存的一部分,而堆内存又细分为新生代和老年代,新生代进一步划分为 Eden 区和 Survivor 区,这样的结构有助于我们理解 JVM 内存分配与容器资源的关系。
1.2 容器快速启停与 JVM 启动时间优化
在云原生的舞台上,容器的快速启停就像演员的 “快速换装”,是实现资源灵活调度和应用弹性伸缩的关键技能。然而,传统 JVM 较长的启动时间,却如同演员厚重的戏服,严重影响了 “换装” 速度。
庆幸的是,GraalVM 的 Substrate VM 技术带来了 “轻便戏服”。它能将 Java 应用提前编译为本地可执行文件,彻底绕过传统 JVM 启动时繁琐的类加载、字节码解释等环节。我们以一个简单的 HTTP 服务为例,看看 Substrate VM 的神奇效果。
首先是使用 Spring Boot 开发的普通 HTTP 服务代码:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class HttpServiceApplication {@GetMapping("/hello")public String hello() {return "Hello, World!";}public static void main(String[] args) {SpringApplication.run(HttpServiceApplication.class, args);}
}
若使用传统方式启动,需要经历漫长的类加载、Spring 容器初始化等过程。而当我们借助 Substrate VM 将其编译为本地可执行文件后,启动时间能从原来的数秒大幅缩短至几百毫秒。具体操作步骤如下(假设已安装 GraalVM 和相关工具):
# 构建Spring Boot项目
mvn clean package# 使用Substrate VM进行本地编译
native-image -jar target/http-service-0.0.1-SNAPSHOT.jar http-service
编译完成后,直接运行生成的http-service
可执行文件,就能体验到极速启动的快感。
此外,JVM 的模块化特性也是提升启动速度的 “秘密武器”。在微服务架构中,每个服务都专注于单一业务功能。我们可以将应用拆分为多个模块,仅让 JVM 加载运行时必需的模块,就像只携带必要的装备上阵,避免冗余类的加载,进一步提升启动效率。
二、JVM 与微服务架构的协同优化
2.1 微服务通信中的 JVM 性能提升
在微服务架构的 “繁华都市” 里,服务间的通信如同城市中川流不息的交通,频繁且至关重要。RPC 框架作为实现服务间通信的 “交通枢纽”,其性能表现直接影响着整个系统的运行效率,而 JVM 则是保障 “交通” 顺畅的 “幕后英雄”。
gRPC 是当下流行的 RPC 框架之一,它基于 HTTP/2 协议,具备高效、轻量等特点。在 JVM 层面,我们可以通过字节码优化和即时编译(JIT)技术,为 gRPC 通信 “疏通道路”。下面是一个简单的 gRPC 服务端和客户端示例代码:
服务端代码:
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;import java.io.IOException;// 定义gRPC服务接口
interface HelloService {void sayHello(String request, StreamObserver<String> responseObserver);
}// 实现gRPC服务接口
class HelloServiceImpl implements HelloService {@Overridepublic void sayHello(String request, StreamObserver<String> responseObserver) {String response = "Hello, " + request;responseObserver.onNext(response);responseObserver.onCompleted();}
}// gRPC服务端主类
public class GrpcServer {private Server server;private void start() throws IOException {int port = 50051;// 构建gRPC服务端,注册HelloService实现类server = ServerBuilder.forPort(port).addService(new HelloServiceImpl()).build().start();System.out.println("Server started, listening on " + port);Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.err.println("*** shutting down gRPC server since JVM is shutting down");GrpcServer.this.stop();System.err.println("*** server shut down");}));}private void stop() {if (server != null) {server.shutdown();}}private void blockUntilShutdown() throws InterruptedException {if (server != null) {server.awaitTermination();}}public static void main(String[] args) throws IOException, InterruptedException {final GrpcServer server = new GrpcServer();server.start();server.blockUntilShutdown();}
}
客户端代码:
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;// 定义gRPC服务接口
interface HelloService {void sayHello(String request, StreamObserver<String> responseObserver);
}// gRPC服务客户端代理类
class HelloServiceStub implements HelloService {private final ManagedChannel channel;public HelloServiceStub(ManagedChannel channel) {this.channel = channel;}@Overridepublic void sayHello(String request, StreamObserver<String> responseObserver) {// 调用gRPC服务方法io.grpc.stub.ClientCalls.asyncUnaryCall(channel.newCall(io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName("HelloService/sayHello").setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(io.grpc.exampleshelloworld.HelloRequest.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(io.grpc.exampleshelloworld.HelloResponse.getDefaultInstance())).build()),io.grpc.exampleshelloworld.HelloRequest.newBuilder().setName(request).build(),responseObserver);}
}// gRPC服务客户端主类
public class GrpcClient {private static final String TARGET = "localhost:50051";private final HelloService stub;private final CountDownLatch finishLatch = new CountDownLatch(1);public GrpcClient(ManagedChannel channel) {stub = new HelloServiceStub(channel);}public void sayHello(String name) {// 异步调用gRPC服务stub.sayHello(name, new StreamObserver<String>() {@Overridepublic void onNext(String value) {System.out.println("Response: " + value);}@Overridepublic void onError(Throwable t) {System.err.println("RPC failed: " + t.getMessage());finishLatch.countDown();}@Overridepublic void onCompleted() {finishLatch.countDown();}});}public static void main(String[] args) throws InterruptedException {ManagedChannel channel = ManagedChannelBuilder.forTarget(TARGET).usePlaintext().build();try {GrpcClient client = new GrpcClient(channel);client.sayHello("World");// 等待异步调用完成client.finishLatch.await(1, TimeUnit.MINUTES);} finally {channel.shutdown();}}
}
在这个示例中,当服务端接收到大量客户端请求时,JIT 编译器会迅速识别出频繁执行的服务方法,对其进行深度优化,减少方法调用和数据序列化 / 反序列化的时间开销。同时,JVM 的多线程机制充分利用多核 CPU 资源,并行处理多个 RPC 请求,让 “交通” 更加顺畅。
针对微服务通信中可能出现的网络延迟问题,JVM 的异步编程模型提供了 “智能导航”。通过CompletableFuture
等异步工具类,在发起 RPC 调用后,主线程无需像 “堵车等待” 一样阻塞,而是可以继续处理其他任务,当响应返回时再进行后续处理,极大地提高了系统资源利用率和响应速度。例如:
import java.util.concurrent.CompletableFuture;public class AsyncRpcCall {public static void main(String[] args) {CompletableFuture.supplyAsync(() -> {// 模拟耗时的RPC调用try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "RPC调用结果";}).thenAccept(result -> {System.out.println("接收到结果:" + result);});// 主线程可以继续执行其他任务System.out.println("主线程执行其他操作");}
}
2.2 微服务治理与 JVM 监控
在庞大复杂的微服务 “生态系统” 中,服务治理如同维持生态平衡的 “守护者”,而 JVM 的运行状态监控则是服务治理的 “千里眼” 和 “顺风耳”。
Java Mission Control(JMC)是一款强大的 JVM 监控和管理 “神器”。它能实时采集 JVM 的内存使用情况、垃圾回收频率、线程状态等关键指标,就像一位 24 小时不间断工作的 “健康监测员”。在一个包含用户服务、订单服务、支付服务等多个微服务的电商集群中,运维人员通过 JMC 对每个服务实例的 JVM 进行监控。当发现订单服务的堆内存使用率持续超过 80%,且垃圾回收时间从原来的几毫秒延长到几百毫秒时,就能快速定位问题服务。通过进一步分析 JMC 提供的详细数据,判断是代码中存在对象创建后未及时释放的内存泄漏问题,还是因为大促期间订单量激增导致内存分配不足,进而采取针对性措施进行优化。
为了更直观地展示 JVM 监控指标,我们用表格呈现常见监控项及其含义:
监控指标 | 含义 | 正常范围参考 |
---|---|---|
堆内存使用率 | 已使用堆内存占总堆内存的比例 | 通常建议不超过 80% |
垃圾回收频率 | 单位时间内垃圾回收次数 | 根据应用负载而定,无固定标准 |
垃圾回收耗时 | 每次垃圾回收操作花费的时间 | Minor GC 通常在几毫秒到几十毫秒,Full GC 可能较长 |
线程数 | 当前 JVM 中活跃线程数量 | 根据应用并发需求而定 |
同时,结合 Prometheus 和 Grafana 等开源监控工具,将 JVM 指标与微服务的业务指标(如请求吞吐量、响应时间等)进行关联分析,能绘制出一幅完整的系统健康 “画像”。例如,通过监控发现某个微服务的响应时间突然从 50ms 增加到 200ms,同时该服务 JVM 的垃圾回收频率显著提高,这很可能意味着内存分配不合理或存在对象创建过于频繁的问题,从而指导开发者进行代码优化和参数调整。
三、JVM 在 Serverless 场景下的创新应用
3.1 Serverless 架构对 JVM 的新要求
Serverless 架构凭借 “无需管理服务器” 的特性,掀起了一场应用开发的 “轻量化革命”。在 Serverless 的世界里,应用的执行环境由云服务商像 “搭积木” 一样动态创建和销毁,这对 JVM 提出了严苛的新要求。
首先,JVM 必须拥有 “闪电般” 的启动速度,以满足 Serverless 函数的快速冷启动需求。冷启动延迟过高,就像餐厅上菜太慢,会严重影响用户体验。如前文提到的 Substrate VM 技术,在 Serverless 场景中就是 “救星”,能将 Java 函数的启动时间压缩到毫秒级,彻底解决冷启动难题。
其次,JVM 的资源占用要尽可能 “精简”。由于 Serverless 平台按函数执行时间和资源使用量计费,减少 JVM 的内存和 CPU 占用就相当于为企业节省真金白银。通过优化 JVM 的垃圾回收算法,选择更适合短生命周期对象回收的 ZGC(Z Garbage Collector),可以在保证性能的同时,大幅降低内存开销。ZGC 的特点是停顿时间短,即使处理大量内存,也能将垃圾回收停顿时间控制在 10ms 以内,非常适合 Serverless 这种对响应速度要求极高的场景。
3.2 JVM 在 Serverless 场景下的实践案例
以 AWS Lambda 为例,众多 Java 开发者在这里书写着 JVM 与 Serverless 融合的精彩篇章。某在线教育平台将课程推荐算法部署为 AWS Lambda 函数,通过精心调整 JVM 参数和采用 ZGC 垃圾回收器,成功将函数执行过程中的停顿时间从原来的 50ms 降低到 5ms 以内,课程推荐的响应速度提升了数倍,用户点击率也随之大幅提高。具体的 JVM 参数配置如下:
# 设置JVM使用ZGC垃圾回收器
# 调整元空间大小,避免因类加载过多导致元空间溢出
java -XX:+UseZGC -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -jar recommendation-service.jar
在阿里云的函数计算服务中,也有不少亮眼的实践。某游戏公司将游戏内的道具发放功能部署为函数计算服务,借助 GraalVM 的 Substrate VM 技术,实现了函数的毫秒级冷启动。在游戏大版本更新当天,面对瞬间涌入的大量道具发放请求,服务依然能快速响应,不仅保障了玩家的游戏体验,还相比传统服务器部署方式,降低了 40% 以上的运维成本和资源消耗。
结束语
亲爱的开源构架技术伙伴们!从容器化环境中与资源限制的 “斗智斗勇”,到微服务架构下与服务通信的 “默契配合”,再到 Serverless 场景里对新要求的 “精准适配”,JVM 在云原生的浪潮中完成了一次又一次华丽的蜕变。它不再只是 Java 程序背后默默工作的 “隐形守护者”,而是走到台前,以创新的姿态与云原生技术深度协作,为企业数字化转型注入强劲动力。
在未来,随着云原生技术的持续演进,诸如 Service Mesh、云原生数据库等新技术不断涌现,JVM 也必将持续迭代。或许在不久的将来,我们能见证 JVM 在边缘计算场景下的精彩表现,或是看到它与人工智能技术碰撞出新的火花。而这一切的可能性,都等待着我们技术人去探索、去实践。
亲爱的开源构架技术伙伴们!在你的项目中,JVM 与云原生的融合是否遇到过独特的挑战?你是如何巧妙化解的?欢迎在评论区或架构师交流讨论区分享您的宝贵经验和见解,让我们一起共同探索这个充满无限可能的技术领域!
亲爱的开源构架技术伙伴们!最后到了投票环节:展望未来,你认为 JVM 在云原生领域将迎来哪项最具突破性的变革?投票直达。
- Java 大厂面试题 – 揭秘 JVM 底层原理:那些令人疯狂的技术真相(New)
- Java 大厂面试题 – JVM 性能优化终极指南:从入门到精通的技术盛宴(New)
- Java 大厂面试题 – JVM 深度剖析:解锁大厂 Offe 的核心密钥(New)
- Java大厂面试高频考点|分布式系统JVM优化实战全解析(附真题)(New)
- Java大厂面试题 – JVM 优化进阶之路:从原理到实战的深度剖析(2)(New)
- Java大厂面试题 – 深度揭秘 JVM 优化:六道面试题与行业巨头实战解析(New)
- 开源架构与人工智能的融合:开启技术新纪元(New)
- 开源架构的自动化测试策略优化版(New)
- 开源架构的容器化部署优化版(New)
- 开源架构的微服务架构实践优化版(New)
- 开源架构中的数据库选择优化版(New)
- 开源架构的未来趋势优化版(New)
- 开源架构学习指南:文档与资源的智慧锦囊(New)
- 开源架构的社区贡献模式:铸就辉煌的创新之路(New)
- 开源架构与云计算的传奇融合(New)
- 开源架构:企业级应用的璀璨之星(New)
- 开源架构的性能优化:极致突破,引领卓越(New)
- 开源架构安全深度解析:挑战、措施与未来(New)
- 如何选择适合的开源架构框架(New)
- 开源架构与闭源架构:精彩对决与明智之选(New)
- 开源架构的优势(New)
- 常见的开源架构框架介绍(New)
- 开源架构的历史与发展(New)
- 开源架构入门指南(New)
- 开源架构师的非凡之旅:探索开源世界的魅力与无限可能(New)
🎯欢迎您投票
相关文章:
JVM 与云原生的完美融合:引领技术潮流
最近佳作推荐: Java 大厂面试题 – 揭秘 JVM 底层原理:那些令人疯狂的技术真相(New) Java 大厂面试题 – JVM 性能优化终极指南:从入门到精通的技术盛宴(New) Java 大厂面试题 – JVM 深度剖析&…...
【进程控制二】进程替换和bash解释器
【进程控制二】进程替换 1.exec系列接口2.execl系列2.1execl接口2.2execlp接口2.3execle 3.execv系列3.1execv3.2总结 4.实现一个bash解释器4.1内建命令 通过fork创建的子进程,会继承父进程的代码和数据,因此本质上还是在执行父进程的代码 进程替换可以将…...
如何查看打开的 git bash 窗口是否是管理员权限打开
在 git bash 中输入: net session >nul 2>&1 && (echo Ok) || (echo Failed) 显示 OK 》是管理员权限; 显示 Failed 》不是管理员权限。 如何删除此步生成的垃圾文件: 新建一个 .txt 文件,输入以下代码…...
ubuntu 22.04 wifi网卡配置地址上网
通过network-manager配置 确定是否存在usb网卡的驱动 rootgpu-server:/etc/netplan# lsmod | grep rt2800usbrt2800usb 32768 0rt2x00usb 24576 1 rt2800usbrt2800lib 139264 1 rt2800usbrt2x00lib 73728 3 rt2800us…...
让 Cursor 教我写 MCP Client
文章目录 1. 写在最前面2. 动手实现一个 MCP Client2.1 How 天气查询 Client2.1.1 向 Cursor 提问的艺术2.1.2 最终成功展示2.1.3 client 的代码 3. MCP 协议核心之一总结3.1 SSE vs WebSocket 4. 碎碎念5. 参考资料 1. 写在最前面 学习了 MCP Server 的实现后,刚好…...
GoogleTest:GMock2 EXPECT_CALL
GoogleTest:GMock初识-CSDN博客 简单的介绍了GMock工作的方式 GMock其实是比较复杂的,先上一个例子,然后再仔细的解读: //not_ready_class.hpp #include <string>class Person { public:virtual ~Person() = default;virtual std::string name() = 0;virtual int a…...
自注意力机制(Self-Attention)前向传播手撕
题目 实现Transformer中自注意力机制的前向传播代码 思路与代码 自注意力机制(Self-Attention)是自然语言处理和深度学习中的一种核心机制,最早在 Transformer 模型中被提出。它的核心思想是:让序列中的每个元素都能动态关注整个…...
华硕服务器-品类介绍
目录 一、核心产品线解析 1. 机架式服务器 2. 塔式服务器 3. 高密度计算服务器 二、关键技术与模组配置 1. 主板与管理模块 2. 电源与散热 3. 存储与网络 三、应用场景与行业解决方案 1. 人工智能与高性能计算 2. 云计算与虚拟化 3. 边缘计算与工业物联网 一、核心…...
【Ansible基础】Ansible设计理念与无代理架构深度解析
目录 1 Ansible概述与核心设计理念 1.1 Ansible的核心设计哲学 1.2 Ansible与其他配置管理工具的对比 2 Ansible无代理架构详解 2.1 无代理架构工作原理 2.2 无代理架构的优势 2.3 无代理架构的局限性 3 Ansible核心组件与架构 3.1 Ansible核心组件架构 组件说明&…...
利用vba替换word中多个表格,相邻单元格的文字
目录 一、效果图1、替换前2、替换后 二、敲代码1、开发者工具→vba编辑器,点击插入模块2、键入以下代码3、代码编辑完成后,开发者工具→运行宏,选择对应名称,运行 一、效果图 标题估计没说明白,上图 1、替换前 2、替…...
动态多因子策略
策略其核心思想是通过多种技术指标的结合,动态调整交易信号,以实现更精准的市场进出和风险管理。 交易逻辑思路 1. 初始化与数据更新: - 在每个Bar的开盘时,更新当日的最高价、最低价和收盘价。 - 计算短期和长期的移动平均线&…...
STC32G12K128实战:串口通信
STC32G12K128芯片写一个按键通过串口1发送字符串的程序。首先,确认芯片的串口1配置。STC32G系列通常使用UART1,相关的寄存器是P_SW1来选择引脚。默认情况下,UART1的TX是P3.1。 接下来是设置定时器作为波特率发生器。通常用定时器2,…...
基于javaweb的SpringBoot高校图书馆座位预约系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
一种资源有限单片机处理cJSON数据的方法
一般单片机处理cJSON格式的数据都直接使用cJSON库,但对于Ram较小的单片机,由于资源有限,这并不合适,但我们可以根据cJSON数据的特定格式,使用土方法,直接对字符进行查找裁剪即可 //截取字符串str中字符a与…...
【2025版】Spring Boot面试题
文章目录 1. Spring, Spring MVC, SpringBoot是什么关系?2. 谈一谈对Spring IoC的理解3. Component 和 Bean 的区别?4. Autowired 和 Resource 的区别?5. 注入Bean的方法有哪些?6. 为什么Spring 官方推荐构造函数注入?…...
C++——类和对象(1)
文章目录 一、前言二、类和对象上2.1 类的定义2.1.1 定义格式一2.1.2 定义格式二2.1.3 注意点 2.2 访问限定符2.2.1 访问限定符的用法 2.3 类域2.4 类的实例化2.4.1 实例化的概念2.4.2 实例化具体举例2.4.3类的实例化对象大小 2.5 this指针2.5.1 this指针的概念2.5.6 this指针的…...
【行为型之观察者模式】游戏开发实战——Unity事件驱动架构的核心实现策略
文章目录 🎯 观察者模式(Observer Pattern)深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码(玩家血量监控系统)1. 定义观察者接口与主题基类2. 实现具体主题(玩家血量)3. 实现…...
Java基础语法之数组
数组 一、认识数组 1.什么是数组 数组就是一个容器,用来存一批同种类型的数据。 举例 20, 10, 80, 60, 90 int[] arr {20, 10, 80, 60, 90};张三, 李四, 王五 String[] names {"张三", "李四", "王五"};2.为什么要使用数组 假设…...
Vue3学习(组合式API——计算属性computed详解)
目录 一、计算属性computed。 Vue官方提供的案例。(普通写法与计算属性写法) 使用计算属性computed重构——>简化描述响应式状态的复杂逻辑。 (1)计算属性computed小案例。 <1>需求说明。(筛选原数组——>得新数组) &…...
高海拔和远距离的人员识别:面部、体型和步态的融合
大家读完就觉得有帮助记得关注和点赞!!! 摘要 我们解决了在无约束环境中进行全身人体识别的问题。这个问题出现在诸如IARPA高空和远距离生物识别与身份识别(BRIAR)计划等监视场景中,其中生物识别数据是在长…...
《P2345 [USACO04OPEN] MooFest G》
题目背景 P5094 [USACO04OPEN] MooFest G 加强版 题目描述 约翰的 n 头奶牛每年都会参加“哞哞大会”。 哞哞大会是奶牛界的盛事。集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。 它们参加活动时会聚在一起,第 i 头…...
浅浅学:DoIP工作流程及基于DoIP的诊断/刷写工具
注:阅读本文需要对UDS及BootLoader有一定了解,基础内容不做赘述。 在汽车"新四化"浪潮的推动下,智能座舱、自动驾驶、车路协同等创新技术正加速重构行业格局。随着车载ECU数量突破百个量级,软件代码量呈指数级增长——…...
首个专业AI设计Agent发布-Lovart
Lovart是什么 Lovart 是为设计师打造的世界上首个专业设计 Agent。Lovart 能像专业设计师一样思考和执行设计任务,提供高水平的设计方案。基于自然语言交互,用户能快速调整布局、颜色和构图。Lovart 支持从创意拆解到专业交付的全链路设计,单…...
二叉树(中序遍历)
嘿,欢迎来到小巫blog!小巫又来啦!看到你对二叉树中序遍历这道题有点困惑,别担心,我会一步步带你搞定它!这道题是树的基础题目,掌握了它,你对树的遍历就会有很深的理解。我相信&#…...
Ubuntu 系统默认已安装 python,此处只需添加一个超链接即可
步骤 1:确认 Python 3 的安装路径 查看当前 Python 3 的路径: which python3 输出类似: /usr/bin/python3 步骤 2:创建符号链接 使用 ln -s 创建符号链接,将 python 指向 python3: sudo ln -s /usr/b…...
AcroForm JavaScript Promise 对象应用示例: 异步加载PDF文件
这段代码演示了在Adobe Acrobat DC Pro 的 JavaScript 环境中如何使用 Promise 对象处理异步操作。具体功能是: 定义了一个loadFile函数,模拟异步加载PDF文件的操作使用Promise对象封装异步操作,提供成功(resolve)和失败(reject)两种状态通过…...
LeetCode 热题 100 114. 二叉树展开为链表
LeetCode 热题 100 | 114. 二叉树展开为链表 大家好,今天我们来解决一道经典的二叉树问题——二叉树展开为链表。这道题在 LeetCode 上被标记为中等难度,要求将二叉树展开为一个单链表,展开后的单链表应该与二叉树的先序遍历顺序相同。 问题…...
DML和DQL
1. 设置MySQL的储存引擎 上一章的附录里已经将ini设置好了,不用再次设置 2. DML语句 插入单数据记录 插入多数据记录 将查询结果插入新表 更新数据 删除数据 注意:delete删除只会删除数据,不会重置表的现有逻辑,truncate会重置表逻…...
多线程与线程互斥
我们初步学习完线程之后,就要来试着写一写多线程了。在写之前,我们需要继续来学习一个线程接口——叫做线程分离。 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法…...
BMS工具箱用来执行贝叶斯模型平均(BMA)计算模块
贝叶斯模型平均(Bayesian Model Averaging,BMA)是一种用于处理模型不确定性的统计方法,通过结合多个模型的预测结果来提高预测的准确性和鲁棒性。在 MATLAB 中,可以使用专门的工具箱(如 BMS 工具箱…...
Java死锁排查:线上救火实战指南
想象一下,你正在值班,突然监控告警红成一片,用户反馈雪花般飘来:“系统卡死了!用不了了!” —— 这很可能就是Java应用遭遇了“死锁”这个大魔王。这时候,你就是救火队长,首要任务不…...
第十九次博客打卡
今天学习的内容是Java中的常见循环。 在 Java 中,常见的循环结构主要有以下几种:for 循环、while 循环、do-while 循环以及增强型 for 循环(也称为 for-each 循环)。 1. for 循环 for 循环是一种非常灵活的循环结构,…...
智能体制作学习笔记1——智能体
01 智能体_哔哩哔哩_bilibili 大语言模型可以理解成一个很厉害的人。 但是要完成一些特定的工作,除了大语言模型,还需要一些工具和业务流程,这样才能自动化帮我们完成特定的工作,这个就叫做智能体。 突然发现放视频的时候出现了…...
Python常见问题
文章目录 1.python有哪些数据类型2.python中的元组和列表的区别是什么?3.python中的break、continue、pass代表什么意思?4.如何在python中生成一个随机数?5.Python有哪些常见的内置函数?6.请用自己最擅长的编程语言,将…...
小程序 存存上下滑动的页面
推荐阅读文档: Vue3组合式API之getCurrentInstance详解 - 且行且思 - 博客园Vue2中,可以通过this来获取当前组件实例; Vue3中,在setup中无法通过this获取组件实例,console.log(this)打印出来的值是undefined。 在Vue3…...
更换git位置并在pycharm中重新配置
更新 PyCharm 中的 Git 路径 更新 PyCharm 终端的 Shell 路径 检查环境变量 确保系统环境变量中的 Path 包含了新的 Git 安装路径 ,如果使用unins0000自动卸载就不会有旧路径。...
AI世界的崩塌:当人类思考枯竭引发数据生态链断裂
AI世界的崩塌:当人类思考枯竭引发数据生态链断裂 ——论过度依赖AI创作对技术进化的反噬 一、数据生态的恶性循环:AI的“自噬危机” 当前AI模型的训练依赖于人类创造的原始数据——书籍、论文、艺术作品、社交媒体动态等。据统计,2025年全球…...
OkHttp连接池
🧰 调整连接池的核心参数 ✅ 最大空闲连接数(maxIdleConnections): 含义:连接池中最多保留的空闲连接数量。默认值:5建议值:10~50(视并发量而定) ✅ 连接保持时间&…...
哈希表的实现01
文章目录 哈希表的实现01哈希概念直接定址法哈希冲突负载因子将关键字转换为整数 哈希函数除法散列法:乘法散列法(了解)全域散列法(了解) 处理哈希冲突(开放定址法)线性探测:二次探测…...
学习日志06 java
还有四天要去比赛了,能赢吗?逼自己一把。。。!!加油! 1 对比一下java重写还是不重写tostring的区别 1. 不重写 toString() 的情况 java class Point {private int x;private int y;public Point(int x, int y) {th…...
spring中的@MapperScan注解详解
一、核心功能与作用 MapperScan是Spring与MyBatis框架集成时用于批量扫描Mapper接口的核心注解,其主要功能包括: 自动注册Mapper接口 通过指定包路径,Spring会自动扫描该路径下的所有Mapper接口,并将其注册为Spring Bean&#x…...
PYTHON训练营DAY25
BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型,例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐:捕获所有类型的异常&…...
视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解
引言 在数字图像与视频压缩领域,离散余弦变换(Discrete Cosine Transform, DCT)凭借其卓越的能量集中特性,成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域,分离出DC系数(直流分量&…...
YOLO v1:目标检测领域的革命性突破
引言 在计算机视觉领域,目标检测一直是一个核心任务,它不仅要识别图像中的物体类别,还要确定物体的精确位置。传统目标检测方法如R-CNN系列虽然准确率高,但计算复杂度高、速度慢。2016年,Joseph Redmon等人提出的YOLO…...
AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)
目录 一、整体工作流设计 二、制作工作流 2.1 开始节点 2.2 大模型_生成对话文案 2.3 代码_字幕切割 2.4 画板_对话背景 2.5 循环_对话语音01 2.5.1 选择器_2 2.5.2 语音合成02 2.5.3 语音合成03 2.5.4 变量聚合_1 2.5.5 视频合成01 2.6 循环_3 2.6.1 选择器_3 …...
HVV蓝队实战面试题
HVV蓝队实战,防守筹备之“部署蜜罐捕获横向扫描行为”。 蜜罐通过模拟内网脆弱服务(如SMB、SSH、数据库端口),诱捕攻击者突破边界后的横向探测行为。 通过监测高频端口扫描、非常规协议请求及非授权IP段遍历,结合多源…...
正则表达式(二)-高级应用_谨慎使用
没事建议别瞎用正则表达式,能让后端处理好的数据,尽量后端处理好,减少前端对数据的处理,保证数据原始的完整性,减少前端耗能。(其实就是懒╮(╯▽╰)╭) 1. 分组捕获 分组捕获用于提取匹配的子字符串,使用 () 定义分组。 示例:提取日期中的年、月、日 (\d{4})-(\d{2…...
在K8S集群中部署EFK日志收集
目录 引言环境准备安装自定义资源部署ElasticsearchMaster 节点与 Data 节点的区别生产优化建议安装好以后测试ES是否正常部署Fluentd测试filebeat是否正常推送日志部署Kibana获取账号密码,账号是:elastic集群测试 引言 系统版本为 Centos7.9内核版本为…...
解决常见数据库问题:保障数据安全与稳定的全方位指南
本文结合行业最佳实践与前沿技术,系统性总结数据库运维中的核心问题与解决方案,助力开发者构建高可靠、高性能的数据服务) 一、性能优化:从SQL到架构的全面调优 性能问题是数据库运维中最常见的挑战,直接影响用户体验…...
武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛
武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛 2025年5月9日至11日,第五届中国膜计算论坛(CWMC 2025)在成都信息工程大学隆重召开。会议由 国际膜计算学会(IMCS) 主办,汇聚了来…...