JVM 与云原生的完美融合:引领技术潮流

news2025/5/15 16:28:29

最近佳作推荐:
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 {
    @Override
    public 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;
    }

    @Override
    public 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>() {
            @Override
            public void onNext(String value) {
                System.out.println("Response: " + value);
            }

            @Override
            public void onError(Throwable t) {
                System.err.println("RPC failed: " + t.getMessage());
                finishLatch.countDown();
            }

            @Override
            public 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 在云原生领域将迎来哪项最具突破性的变革?投票直达。


---推荐文章---

  1. Java 大厂面试题 – 揭秘 JVM 底层原理:那些令人疯狂的技术真相(New)
  2. Java 大厂面试题 – JVM 性能优化终极指南:从入门到精通的技术盛宴(New)
  3. Java 大厂面试题 – JVM 深度剖析:解锁大厂 Offe 的核心密钥(New)
  4. Java大厂面试高频考点|分布式系统JVM优化实战全解析(附真题)(New)
  5. Java大厂面试题 – JVM 优化进阶之路:从原理到实战的深度剖析(2)(New)
  6. Java大厂面试题 – 深度揭秘 JVM 优化:六道面试题与行业巨头实战解析(New)
  7. 开源架构与人工智能的融合:开启技术新纪元(New)
  8. 开源架构的自动化测试策略优化版(New)
  9. 开源架构的容器化部署优化版(New)
  10. 开源架构的微服务架构实践优化版(New)
  11. 开源架构中的数据库选择优化版(New)
  12. 开源架构的未来趋势优化版(New)
  13. 开源架构学习指南:文档与资源的智慧锦囊(New)
  14. 开源架构的社区贡献模式:铸就辉煌的创新之路(New)
  15. 开源架构与云计算的传奇融合(New)
  16. 开源架构:企业级应用的璀璨之星(New)
  17. 开源架构的性能优化:极致突破,引领卓越(New)
  18. 开源架构安全深度解析:挑战、措施与未来(New)
  19. 如何选择适合的开源架构框架(New)
  20. 开源架构与闭源架构:精彩对决与明智之选(New)
  21. 开源架构的优势(New)
  22. 常见的开源架构框架介绍(New)
  23. 开源架构的历史与发展(New)
  24. 开源架构入门指南(New)
  25. 开源架构师的非凡之旅:探索开源世界的魅力与无限可能(New)

🎯欢迎您投票

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为何大模型都使用decoder-only?

第一章 架构之争的历史脉络 1.1 从双向到单向的革命 2017年&#xff0c;BERT的横空出世让双向注意力机制成为NLP领域的“武林盟主”。通过Masked Language Modeling&#xff08;MLM&#xff09;&#xff0c;BERT在阅读理解、情感分析等任务中展现出惊人的表现&#xff0c;但它…

企业报表平台如何实现降本增效

一、你的企业是否正被这些问题拖累&#xff1f;‌ 财务还在手动汇总各门店的Excel销售数据&#xff1b;市场部总抱怨“客户分析全靠拍脑袋”&#xff1b;仓库突然发现爆款断货&#xff0c;但上周的报表显示库存充足…… 这些场景你是否熟悉&#xff1f;数据散落在ERP、E…

Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用

前言&#xff1a; 因为想到有些环境可能没法使用外网的大模型&#xff0c;所以可能需要内网部署&#xff0c;看了一下ollama适合小型的部署&#xff0c;所以就尝试了一下&#xff0c;觉得docker稍微简单一点&#xff0c;就做这个教程的&#xff0c;本文中重要的内容都会给下载…

ultralytics中tasks.py---parse_model函数解析

一、根据scale获取对应的深度、宽度和最大通道数 具体例如yaml文件内容如下: depth=0.33,那么重复的模块例如C2f原本重复次数是3,6,6,3,那么T对应的模型重复次数就是三分之一即1,1,2,1次。这个在后面定义的: width=0.25,max_channels=1024 原本c2=64,但经过make_div…

2024年业绩增速大幅回退,泸州老窖未能“重回前三”

撰稿|行星 来源|贝多财经 回望过去的2024年&#xff0c;受制于购买力与消费需求的持续疲软&#xff0c;白酒行业的发展面临诸多复杂性与不确定性&#xff0c;“量价齐跌”犹如笼罩在各大企业头顶的一片阴云。 正如巴菲特所言&#xff1a;“当潮水退去时&#xff0c;才知道谁在…

院校机试刷题第二天:1479 01字符串、1701非素数个数

一、1479 01字符串 1.题目描述 2.解题思路 方法一&#xff1a;暴力法 模拟过程&#xff0c;列出几个数据来a[1]1, a[2]2, a[3]3, a[4]5以此类推&#xff0c;这就是斐波那契数列&#xff0c;每一项都等于前两项之和&#xff0c;确定好a[1], a[2]即可。 方法二&#xff1a;动…

制作一款打飞机游戏48:敌人转向

射击功能 有一个重要的功能我们还没实现&#xff0c;那就是射击。目前&#xff0c;敌人还不能射击&#xff0c;这显然是不行的。因此&#xff0c;我们决定添加一个射击命令&#xff0c;暂时用一个显示圆圈的方式来表示射击动作。 编程语言的调试 有趣的是&#xff0c;我们创…

RK3588 串行解串板,支持8路GMSL相机

RK3588 支持的 GMSL 相机接入数量取决于所使用的解串板型号及配置方案&#xff1a; ‌xcDeserializer3.0 解串板‌ 可接入最多 ‌8 路 2M GMSL2 相机‌1。 ‌xcDeserializer4.0 解串板‌ 支持 ‌4 路 2M GMSL2 相机‌1。 ‌边缘计算盒解决方案‌ 部分商用方案可实现 ‌4 或 8…

OracleLinux7.9-ssh问题

有套rac环境&#xff0c;db1主机无法ssh db1和db1-priv&#xff0c;可以ssh登录 db2和db2-priv [rootdb1 ~]# ssh db1 ^C [rootdb1 ~]# ssh db2 Last login: Wed May 14 18:25:19 2025 from db2 [rootdb2 ~]# ssh db2 Last login: Wed May 14 18:25:35 2025 from db1 [rootdb2…

手机换IP真的有用吗?可以干什么?

在当今数字化时代&#xff0c;网络安全和个人隐私保护日益受到重视。手机作为我们日常生活中不可或缺的工具&#xff0c;其网络活动痕迹往往通过IP地址被记录和追踪。那么&#xff0c;手机换IP真的有用吗&#xff1f;它能为我们带来哪些实际好处&#xff1f;本文将为你一一解答…

如何实现一个运动会计分系统?(C语言版)

一、需求分析 设计一个运动会计分系统,计分信息包括参加学校,参与项目,性别,名次个数,各个学校获得名次信息。该系统具有以下功能 数据录入: 链表或结构体数组组织数据数据报表: 依照规定的报表格式对数据打印报表数据排序: 按照要求对数据进行统计,含简单统计及综合统计…

嵌入式学习笔记 - STM32 ADC,多重转换,内部参考电压,过采样,逐次逼近原理,采样时间

一 多个ADC器件&#xff0c;多重转换速率 每个型号MCU通常由多个ADC器件&#xff0c;比如STM32F4有三个ADC器件&#xff0c;每个ADC器件有一个最大转换速率&#xff0c;一般为2.4Mhz&#xff0c;即一个ADC器件每秒最多转换2.4M次&#xff0c;两次转换之间需要有时间间隔&#…

团结引擎 1.5.0 发布,抖音小游戏平台即将开放、Shader Graph功能新增…引擎能力再提升!

「团结引擎 1.5.0」来啦&#xff01;本次技术更新的内容&#xff0c;涵盖了小游戏、团结引擎车机版、OpenHarmony、Shader Graph、Muse Chat、Hub&License、代码升级、Digital Asset Manager for Tuanjie、团结官方开源车模 Sample 几大方向。 小游戏 在 Tuanjie 1.5.0 版…

如何配置activemq,支持使用wss协议连接。

1、到阿里云申请一个证书&#xff0c;通过后下载jks证书。 2、配置activemq&#xff1a; 打开activemq安装目录中“conf/activemq.xml”&#xff0c;增加以下记录&#xff1a; <transportConnectors> <transportConnector name"wss" uri"…

初学c语言14(指针6)

一.sizeof和strlen的对比 1.sizeof 操作符&#xff0c;计算变量所占空间大小 2.strlen 库函数&#xff0c;函数原型为&#xff1a; 求的是字符串的长度&#xff0c;统计的是“\0”之前的字符个数 二.指针和笔试题解析 补充&#xff1a;数组名的意义 1.sizeof(数组名) 这…

数字化转型-4A架构之技术架构

4A架构系列文章 数字化转型-4A架构&#xff08;业务架构、应用架构、数据架构、技术架构&#xff09; 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数字化转型-4A架构之数据架构 数字化转型-4A架构之技术架构 一、 技术架构 Technology Architecture 1. 技…

kaggle薅羊毛

参考&#xff1a;https://pytorch-tutorial.readthedocs.io/en/latest/tutorial/chapter05_application/5_1_kaggle/#512-kaggle https://github.com/girls-in-ai/Girls-In-AI/blob/master/machine_learning_diary/data_analysis/kaggle_intro.md 1&#xff0c;code training…

TCP 三次握手建立连接详解

文章目录 一、三次握手流程1、第一次握手2、第二次握手3、第三次握手 二、引申问题1、报文丢失&#xff0c;会发生什么&#xff1f;1.1、第一次握手丢失1.2、第二次握手丢失1.3、第三次握手丢失 2、为什么 ISN(Initial Sequence Number&#xff0c;初始序列号) 不固定3、为什么…

高海拔和远距离的人员识别:面部、体型和步态的融合

大家读完就觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 我们解决了在无约束环境中进行全身人体识别的问题。这个问题出现在诸如IARPA高空和远距离生物识别与身份识别&#xff08;BRIAR&#xff09;计划等监视场景中&#xff0c;其中生物识别数据是在长…

自然语言处理入门级项目——文本分类

文章目录 前言1.数据预处理1.1数据集介绍1.2数据集抽取1.3划分数据集1.4数据清洗1.5数据保存 2.样本的向量化表征2.1词汇表2.2向量化2.3自定义数据集2.4备注 结语 前言 本篇博客主要介绍自然语言处理领域中一个项目案例——文本分类&#xff0c;具体而言就是判断评价属于积极还…