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

JVM 双亲委派机制

   一、从 JDK 到 JVM:Java 运行环境的基石  

        在 Java 开发领域,JDK(Java Development Kit)是开发者的核心工具包。它不仅包含了编译 Java 代码的工具(如 javac),还内置了 JRE(Java Runtime Environment)—— 即 Java 程序的运行时环境。而 JVM(Java Virtual Machine)则是 JRE 的核心,它如同一个 “翻译官”,将 Java 字节码转换为不同操作系统能理解的机器指令,实现了 “一次编写,到处运行” 的跨平台特性。

1.JVM 作用

Java 虚拟机负责装载字节码到其内部,解释/编译为对应平台上的机器码指令执行。

现在的 JVM 不仅可以执行 java 字节码文件,还可以执行其他语言编译后的字节码文件,是一个跨语言平台. 


 


程序在执行之前先要把 java 代码转换成字节码(class 文件),jvm首先需要把字节码通过一定的方式 类加载器(ClassLoader)把文件加载到内存中的运行时数据区(Runtime Data Area) ,而字节码文件是jvm的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引擎(Execution Engine) 将字节码翻译成底层系统指令再交由CPU 去执行,而这个过程中需要调用其他语言的接口本地库接口(NativeInterface) 来实现整个程序的功能,这就是这 4 个主要组成部分的职责与功能。 

        比如,当我们运行java HelloWorld时,JVM 首先通过类加载器找到HelloWorld.class文件,将二进制数据读入内存,创建HelloWorld.class对象。


二、JVM 模块划分与核心功能

JVM 的架构可分为四大模块:类加载器子系统运行时数据区执行引擎本地方法接口

1. 类加载器子系统

类加载器负责将字节码文件加载到 JVM 中。根据职责不同,JVM 提供了三种类加载器:

  • 启动类加载器(Bootstrap ClassLoader):用 C/C++ 实现,加载 Java 核心类库(如rt.jar),位于%JAVA_HOME%/lib目录。
  • 扩展类加载器(Extension ClassLoader):加载%JAVA_HOME%/jre/lib/ext目录或java.ext.dirs指定路径的类库。
  • 应用程序类加载器(Application ClassLoader):加载用户类路径(classpath)下的类,是程序默认的类加载器。

        类加载器采用双亲委派机制:当一个类加载器收到加载请求时,会先委托父类加载器处理,只有父类无法加载时才尝试自己加载。这一机制确保了核心类的安全性和唯一性。例如,当尝试加载java.lang.String时,启动类加载器会优先加载核心库中的 String 类,避免用户自定义类覆盖核心类。

2. 运行时数据区

运行时数据区是 JVM 在执行程序时分配的内存区域,包含以下部分:

  • 程序计数器:记录当前线程执行的字节码指令地址,是线程私有的最小内存空间。
  • Java 虚拟机栈:每个线程创建时生成,保存方法调用的栈帧(包含局部变量表、操作数栈、方法返回地址等),线程私有,可能出现栈溢出(StackOverflowError)。
  • 本地方法栈:管理本地方法(如 C/C++ 实现的方法)的调用。
  • 堆内存:存储对象实例,是 GC(垃圾回收)的主要区域,分为新生代(Eden 和 Survivor 区)和老年代,通过分代收集算法优化回收效率。
  • 方法区:存储类的元数据(如字节码、静态变量、常量池),JDK8 后称为元空间(Metaspace),逻辑上独立于堆。

3. 执行引擎

执行引擎是 JVM 的 “大脑”,负责将字节码转换为机器指令。它包含:

  • 解释器:逐行解释执行字节码,启动快但效率较低。
  • JIT 编译器:将频繁执行的 “热点代码” 编译为本地机器码,存储在方法区的 JIT 缓存中,提升执行效率。
  • 垃圾回收器:自动回收不再使用的对象,主要针对堆内存,采用标记 - 复制、标记 - 清除、标记 - 压缩等算法。

4. 本地方法接口

        本地方法接口允许 Java 调用非 Java 代码(如 C/C++),通过本地方法库实现与操作系统或硬件的交互,例如文件操作、网络通信等。

三、类加载的核心机制与实践

1. 类加载的作用与过程

类加载的核心任务是将字节码文件转换为 JVM 可识别的 Class 对象。这一过程分为五个阶段:

  1. 加载(Loading):通过类的全限定名获取二进制字节流,生成 Class 对象。
  2. 验证(Verification):检查字节码的安全性和合规性,防止恶意代码攻击。
  3. 准备(Preparation):为静态变量分配内存并设置默认初始值(如 int 初始化为 0)。
  4. 解析(Resolution):将符号引用转换为直接引用(如将类名转换为内存地址)。
  5. 初始化(Initialization):执行静态代码块和静态变量赋值,这是类加载的最后一步。

2. 类加载的触发时机

        类加载遵循 “按需加载” 原则,只有在需要使用类时才会触发。根据 JVM 规范,以下情况会强制加载类(主动引用):

假设我们有一个 Hello 类

package com.ffyc.classload;/*** 问题:什么时候类会被加载?**/
public class Hello {// 作为静态成员时,类会被加载static {System.out.println("类被加载了......");}//作为main方法时,类也会被加载public static void main(String[] args) {System.out.println("1111111");}}

TestHello 类 

package com.ffyc.classload;public class TestHello {public static void main(String[] args) throws ClassNotFoundException {new Hello(); // 触发Hello类的初始化,并加载Hello类Class.forName("com.ffyc.classload.Hello");//反射方式加载Hello类}}

3. 类加载的典型案例

(1) 主动引用(必定触发加载)
  • new 实例化对象
    MyClass obj = new MyClass();  // 首次创建对象时加载
    
  • 访问类的静态变量或静态方法
    int value = MyClass.staticField;  // 访问静态字段
    MyClass.staticMethod();           // 调用静态方法
    
  • 反射调用(Class.forName()
    Class.forName("com.example.MyClass");  // 通过反射强制加载
    
  • 初始化子类时(父类优先加载)
    class Parent {}
    class Child extends Parent {}  
    // 首次使用 Child 时,会先加载 Parent
    
  • 作为程序入口的主类(main 方法所在类)
    public class Main {  public static void main(String[] args) {}  // JVM 启动时加载
    }
    
(2) 被动引用(不会触发加载)
  • 通过子类引用父类的静态字段
    class Parent { static int value = 10; }
    class Child extends Parent {}
    System.out.println(Child.value);  // 仅加载 Parent,不加载 Child
    
  • 通过数组定义类
    MyClass[] arr = new MyClass[10];  // 不会加载 MyClass
    
  • 引用常量(常量在编译期优化)
    class MyClass { final static int VALUE = 10; }
    System.out.println(MyClass.VALUE);  // 不触发加载(常量池直接访问)

四、类加载器分类

站在 java 开发人员的角度来看,类加载器就应当划分得更细致一些. 保持者三层类加载器.

1. 启动类加载器 (BootStrap ClassLoader)

        这个类加载器使用 C/C++语言实现,也叫引导类加载器,嵌套在 JVM 内部.它用来加载java 核心类库.负责加载扩展类加载器和应用类加载器,并为他们指定父类加载器. 出于安全考虑,启动类加载器只加载存放在\lib 目录,或者被-Xbootclasspath 参数锁指定的路径中存储放的类.

2. 扩展类加载器(Extension ClassLoader)

        Java 语言编写的,由 sun.misc.Launcher$ExtClassLoader 实现. 派生于 ClassLoader 类. 从 java.ext.dirs 系统属性所指定的目录中加载类库,或从JDK 系统安装目录的jre/lib/ext 子目录(扩展目录)下加载类库.如果用户创建的jar 放在此目录下,也会自动由扩展类加载器加载.

3. 应用程序类加载器(系统类加载器 Application ClassLoader)

        Java 语言编写的,由 sun.misc.Launcher$AppClassLoader 实现.派生于 ClassLoader 类. 加载我们自己定义的类,用于加载用户类路径(classpath)上所有的类. 该类加载器是程序中默认的类加载器.ClassLoader 类 , 它 是 一 个 抽 象 类 , 其 后 所 有的类加载器都继承自ClassLoader(不包括启动类加载器)

 五、双亲委派机制

        Java 虚拟机对 class 文件采用的是按需加载的方式,也就是说当需要该类时才会将它的 class 文件加载到内存中生成 class 对象.而且加载某个类的class 文件时,Java 虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式.

工作原理:

1. 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行.

2. 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器.

3. 如果父类加载器可以完成类的加载任务,就成功返回,倘若父类加载器无法完成加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制. 如果均加载失败,就会抛出 ClassNotFoundException 异常。

那么思考一下,如果我们自定义一个 String 类,会被加载吗?

直接上示例去验证你的答案

 

package java.lang;/*** 测试双亲委派机制*/
public class String {static {System.out.println("自定义 String 类被加载!");}
}
package com.ffyc.classload;public class TestHello {public static void main(String[] args) {new Hello(); // 触发Hello类的初始化,并加载Hello类try {Class.forName("com.ffyc.classload.Hello");//反射方式加载Hello类Class.forName("java.lang.String");} catch (ClassNotFoundException e) {throw new RuntimeException(e);}System.out.println("String类加载器为:"+ String.class.getClassLoader()+"所以属于启动类加载器");System.out.println("Hello类加载器为:"+Hello.class.getClassLoader()+"所以属于系统类加载器");}}

输出结果为,并没有看到  "自定义 String 类被加载!"  这句话

        可以看到,自定义的String 类虽然和jdk的String类同包同名,但还是没有被加载,这就是双亲委派机制,那么问题来了,我就想让它加载我自己定义的String类,该怎么做?

六、如何打破双亲委派机制

        Java 虚拟机的类加载器本身可以满足加载的要求,但是也允许开发者自定义类加载器。 在 ClassLoader 类中涉及类加载的方法有两个,loadClass(String name), findClass(String name),这两个方法并没有被 final 修饰,也就表示其他子类可以重写. 重写 findClass 方法 我们可以通过自定义类加载重写方法打破双亲委派机制, 再例如 tomcat 等都有自己定义的类加载器.

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;public class CustomClassLoader extends ClassLoader {private final String classPath;public CustomClassLoader(String classPath) {this.classPath = classPath;}@Overrideprotected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {synchronized (getClassLoadingLock(name)) {// 检查是否已加载过该类Class<?> loadedClass = findLoadedClass(name);if (loadedClass != null) {return loadedClass;}// 打破双亲委派:先尝试自己加载,再委托父类try {// 自定义加载逻辑(例如从指定路径加载类)byte[] classBytes = loadClassBytes(name);if (classBytes != null) {return defineClass(name, classBytes, 0, classBytes.length);}} catch (IOException e) {// 加载失败,继续委托父类加载器}// 委托父类加载器(保留原有机制的兜底)return super.loadClass(name, resolve);}}private byte[] loadClassBytes(String className) throws IOException {// 将类名转换为文件路径(例如com.example.MyClass → /path/com/example/MyClass.class)String path = classPath + File.separator + className.replace('.', File.separatorChar) + ".class";File file = new File(path);if (!file.exists()) {return null;}try (FileInputStream fis = new FileInputStream(file)) {byte[] bytes = new byte[(int) file.length()];fis.read(bytes);return bytes;}}
}
public class Main {public static void main(String[] args) throws Exception {// 创建自定义类加载器,指定加载路径CustomClassLoader loader = new CustomClassLoader("/path/to/classes");// 加载自定义类(优先从指定路径加载)Class<?> clazz = loader.loadClass("com.example.MyClass");Object instance = clazz.newInstance();System.out.println(instance.getClass().getClassLoader()); // 输出:CustomClassLoader}
}

七、总结

        JVM 的类加载机制是 Java 程序运行的基石,它通过类加载器、运行时数据区和执行引擎的协同工作,确保了程序的跨平台性和高效执行。理解类加载的过程、时机和类加载器的工作原理,不仅能帮助开发者优化程序性能,还能深入排查类冲突、内存泄漏等问题。无论是日常开发还是高级调优,掌握 JVM 类加载机制都是成为优秀 Java 工程师的必经之路。

    相关文章:

    JVM 双亲委派机制

    一、从 JDK 到 JVM&#xff1a;Java 运行环境的基石 在 Java 开发领域&#xff0c;JDK&#xff08;Java Development Kit&#xff09;是开发者的核心工具包。它不仅包含了编译 Java 代码的工具&#xff08;如 javac&#xff09;&#xff0c;还内置了 JRE&#xff08;Java Run…...

    shell脚本之条件判断,循环控制,exit详解

    if条件语句的语法及案例 一、基本语法结构 1. 单条件判断 if [ 条件 ]; then命令1命令2... fi2. 双分支&#xff08;if-else&#xff09; if [ 条件 ]; then条件为真时执行的命令 else条件为假时执行的命令 fi3. 多分支&#xff08;if-elif-else&#xff09; if [ 条件1 ]…...

    什么是私有IP地址?如何判断是不是私有ip地址

    在互联网的世界中&#xff0c;IP地址是设备之间通信的基础标识。无论是浏览网页、发送邮件还是在线游戏&#xff0c;IP地址都扮演着至关重要的角色。然而&#xff0c;并非所有的IP地址都是公开的&#xff0c;有些IP地址被保留用于内部网络&#xff0c;这就是我们所说的私有IP地…...

    BGP路由策略 基础实验

    要求: 1.使用Preva1策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2.用AS_Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3.配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略&#xff0c;确保R1通过R2到达192.168.1.0/24 …...

    Java 原生网络编程(BIO | NIO | Reactor 模式)

    1、基本常识 Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;是一组接口&#xff0c;使用了门面模式对应用层隐藏了传输层以下的实现细节。TCP 用主机的 IP 地址加上主机端口号作为 TCP 连接的端点&#xff0c;该端点叫做套接字 Socket。 比如三次握手&…...

    大语言模型 11 - 从0开始训练GPT 0.25B参数量 MiniMind2 准备数据与训练模型 DPO直接偏好优化

    写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…...

    【Java ee初阶】HTTP(4)

    构造HTTP请求 1&#xff09;开发中&#xff0c;前后端交互。浏览器运行的网页中&#xff0c;构造出HTTP请求 2&#xff09;调试阶段&#xff0c;通过构造HTTP请求测试服务器 朴素的方案&#xff1a; 通过tcp socket 的方式构造HTTP请求 按照HTTP请求格式&#xff0c;往TCP…...

    永久免费!专为 Apache Doris 打造的可视化数据管理工具 SelectDB Studio V1.1.0 重磅发布!

    作为全球领先的开源实时数据仓库&#xff0c; Apache Doris Github Stars 已超过 13.6k&#xff0c;并在 5000 余家中大型企业生产环境得到广泛应用&#xff0c;支撑业务核心场景&#xff0c;成为众多企业数据分析基础设施不可或缺的重要基座。过去&#xff0c;Apache Doris 用…...

    React中useDeferredValue与useTransition终极对比。

    文章目录 前言一、核心差异对比二、代码示例对比1. useDeferredValue&#xff1a;延迟搜索结果更新2. useTransition&#xff1a;延迟路由切换 三、应用场景总结四、注意事项五、原理剖析1. 核心机制对比2. 关键差异3. 代码实现原理 总结 前言 在React的并发模式下&#xff0c…...

    Git 项目切换到新的远程仓库地址

    已存在的 Git 项目切换到新的远程仓库地址&#xff0c;比如你要换成&#xff1a; gitgithub.com:baoing/test-app.git步骤如下&#xff1a; 查看当前的远程仓库地址&#xff08;可选&#xff09; git remote -v你会看到类似&#xff1a; origin gitgithub.com:old-user/old…...

    科技晚报 AI 速递:今日科技热点一览 丨 2025 年 5 月 17 日

    科技晚报AI速递:今日科技热点一览 丨2025年5月17日 我们为您汇总今日的科技领域最新动向&#xff0c;带您快速了解前沿技术、突破性研究及行业趋势。 黄仁勋劝特朗普&#xff1a;AI 芯片出口规则得改&#xff0c;中国紧追其后&#xff1a;英伟达 CEO 黄仁勋在华盛顿 “山与谷论…...

    基于OpenCV的SIFT特征和FLANN匹配器的指纹认证

    文章目录 引言一、概述二、代码解析1. 图像显示函数2. 核心认证函数3. 匹配点筛选4. 认证判断 三、主程序四、技术要点五、总结 引言 在计算机视觉领域&#xff0c;图像特征匹配是一个非常重要的技术&#xff0c;广泛应用于物体识别、图像拼接、运动跟踪等场景。今天将介绍一个…...

    【Linux】共享内存

    &#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 ☃️共享内存 &#x1fa84; shmget函数 用来创建共享内存 ✨共享内存的管理指令&#xff1a; &#x1f320; shmid VS key ✨共享内存函数 &#x1f354; shmget() 创建共享内存 &a…...

    Cookie、Session、Token

    Cookie 1. 什么是cookie? Cookie 是一种由服务器发送到客户端浏览器的小数据片段&#xff0c;用于存储用户的状态信息。例如&#xff0c;用户登录状态或用户偏好设置可以通过Cookie进行管理。计算机cookie更正式地称为 HTTP cookie、网络 cookie、互联网 cookie 或浏览器 coo…...

    设计模式Java

    UML类图 概述 类图(Class diagram)是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。 类图的作用 在软件工程中&#xff0c;类图是一种静态的结构图&#xff0c…...

    Word文档图片排版与批量处理工具推荐

    先放下载链接:夸克网盘下载 前几天给大家推荐了 Excel 图片调整软件&#xff0c;当时好多小伙伴问有没有 Word 相关的软件。我在网上找了一圈都没找到合适的&#xff0c;最后在我好久之前记录的一个文档里发现了&#xff0c;这不&#xff0c;马上就来给大家推荐&#xff0c;有…...

    [案例五] 实体——赋值质量

    最近翻阅了实验室其他人编写的一个“质量赋值”功能,能够直接为实体或组件设定质量。出于好奇,我对其进行了分析。由于自己平时没有用到该功能,所以也借此机会学习一下。 在分析过程中,我发现NX 官方其实并没有提供直接修改质量的功能。一般来说,质量是通过“密度 体积”…...

    手撕四种常用设计模式(工厂,策略,代理,单例)

    工厂模式 一、工厂模式的总体好处 解耦&#xff1a;客户端与具体实现类解耦&#xff0c;符合“开闭原则”。统一创建&#xff1a;对象创建交由工厂处理&#xff0c;便于集中控制。增强可维护性&#xff1a;新增对象种类时不需要大改动调用代码。便于扩展&#xff1a;易于管理…...

    C# 深入理解类(静态函数成员)

    静态函数成员 除了静态字段&#xff0c;还有静态函数成员。 如同静态字段&#xff0c;静态函数成员独立于任何类实例。即使没有类的实例&#xff0c;仍然可以调用静 态方法。静态函数成员不能访问实例成员&#xff0c;但能访问其他静态成员。 例如&#xff0c;下面的类包含一…...

    数据类型转换

    文章目录 基本数据类型&#xff08;primitive type&#xff09;整数类型&#xff1a;浮点类型字符类型boolean类型 类型转换类型转换注意点 基本数据类型&#xff08;primitive type&#xff09; 整数类型&#xff1a; ​ byte占1个字节范围&#xff1a;-128-127 ​ short占…...

    深入理解 TypeScript 中的 unknown 类型:安全处理未知数据的最佳实践

    在 TypeScript 的类型体系中&#xff0c;unknown 是一个极具特色的类型。它与 any 看似相似&#xff0c;却在安全性上有着本质差异。本文将从设计理念、核心特性、使用场景及最佳实践等方面深入剖析 unknown&#xff0c;帮助开发者在处理动态数据时既能保持灵活性&#xff0c;又…...

    AI:人形机器人的应用场景以及商业化落地潜力分析

    应用场景分析 人形机器人的设计使其能够适应人类环境&#xff0c;执行多样化任务。以下是未来主要的应用场景及其详细分析&#xff1a; 医疗与护理 具体应用&#xff1a; 老年护理&#xff1a;协助老年人穿衣、洗澡、喂食&#xff0c;或提供情感陪伴。康复辅助&#xff1a;帮助…...

    JavaScript入门【3】面向对象

    1.对象: 1.概述: 在js中除了5中基本类型之外,剩下得都是对象Object类型(引用类型),他们的顶级父类是Object;2.形式: 在js中,对象类型的格式为key-value形式,key表示属性,value表示属性的值3.创建对象的方式: 方式1:通过new关键字创建(不常用) let person new Object();// 添…...

    亲测有效!OGG 创建抽取进程报错 OGG-08241,如何解决?

    前言 今天在测试 OGG 一个功能的时候&#xff0c;需要重新初始化 oggca&#xff0c;所以重装了一下 OGG。重建完之后重新添加抽取进程报错&#xff0c;一直无法添加成功&#xff1a; 经过一翻分析&#xff0c;找到了解决方案&#xff0c;本文记录一下解决过程。 问题描述 OG…...

    【第二篇】 初步解析Spring Boot

    简介 SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是为了用来简化Spring应用的初始搭建以及开发过程的。本文章将详细介绍SpringBoot为什么能够简化项目的搭建以及普通的Spring程序的开发。文章内容若存在错误或需改进的地方&#xff0c;欢迎大家指正&#…...

    JVM 机制

    目录 一、什么是 JVM&#xff1a; 二、JVM 的运行流程&#xff1a; 三、JVM 内存区域划分&#xff1a; 1、( 1 ) 程序计数器&#xff1a; 1、( 2 ) 元数据区&#xff1a; 1、( 3 ) 栈&#xff1a; 1、( 4 ) 堆&#xff1a; 四、类加载&#xff1a; 1、什么时候会触…...

    Java泛型详解

    文章目录 1. 引言1.1 什么是泛型1.2 为什么需要泛型1.3 泛型的优势2. 泛型基础2.1 泛型类多个类型参数2.2 泛型方法2.3 泛型接口2.4 类型参数命名约定3. 类型擦除3.1 什么是类型擦除3.2 类型擦除的影响1. 无法获取泛型类型参数的实际类型2. 无法创建泛型类型的数组3. 无法使用`…...

    机器学习,深度学习,神经网络,深度神经网络之间有何区别?

    先说个人观点&#xff1a;机器学习>神经网络>深度学习≈深度神经网络。深度学习是基于深度神经网络的&#xff0c;深度神经网络和浅层神经网络都是神经网络&#xff0c;而机器学习是包括神经网络在内的算法。 一、机器学习 先说涵盖范围最广的机器学习。机器学习&#…...

    AtomicInteger

    AtomicInteger 是 Java 并发包 (java.util.concurrent.atomic) 中的一个原子类&#xff0c;用于在多线程环境下对整数进行原子操作。 核心特性 原子性 提供线程安全的原子操作&#xff08;如自增、加法、比较并交换等&#xff09;&#xff0c;确保在多线程环境中操作不会被中…...

    威布尔比例风险模型(Weibull Proportional Hazards Model, WPHM)详解:原理、应用与实施

    威布尔比例风险模型&#xff08;Weibull Proportional Hazards Model, WPHM&#xff09;详解&#xff1a;原理、应用与实施 一、核心原理&#xff1a;从威布尔分布到比例风险模型 1. 威布尔分布的数学本质 威布尔分布通过两个关键参数&#xff08;形状参数 (k) 和尺度参数 (\…...

    Dubbo:Docker部署Zookeeper、Dubbo Admin的详细教程和SpringBoot整合Dubbo的实战与演练

    &#x1fa81;&#x1f341; 希望本文能给您带来帮助&#xff0c;如果有任何问题&#xff0c;欢迎批评指正&#xff01;&#x1f405;&#x1f43e;&#x1f341;&#x1f425; 文章目录 一、背景二、Dubbo概述三、Dubbo与SpringCloud的关系四、Dubbo技术架构五、Docker安装Zoo…...

    Windows 上安装下载并配置 Apache Maven

    1. 下载 Maven 访问官网&#xff1a; 打开 Apache Maven 下载页面。 选择版本&#xff1a; 下载最新的 Binary zip archive&#xff08;例如 apache-maven-3.9.9-bin.zip&#xff09;。 注意&#xff1a;不要下载 -src 版本&#xff08;那是源码包&#xff09;。 2. 解压 Mave…...

    Unbuntu 命令

    Ubuntu 命令速查表​ ​分类​​命令​​功能描述​​示例/常用选项​​​​文件与目录​ls列出目录内容ls -a&#xff08;显示隐藏文件&#xff09;; ls -lh&#xff08;详细列表易读大小&#xff09; cd切换目录cd ~&#xff08;主目录&#xff09;; cd ..&#xff08;上级…...

    机器学习-人与机器生数据的区分模型测试-数据处理1

    附件为训练数据&#xff0c;总体的流程可以作为参考。 导入依赖 import pandas as pd import os import numpy as np from sklearn.model_selection import train_test_split,GridSearchCV from sklearn.ensemble import RandomForestClassifier,VotingClassifier from skle…...

    【Linux】进程间通信(一):认识管道

    &#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲进程间通信——认识管道 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xff0c;C语言入门基础&a…...

    AMD Vivado™ 设计套件生成加密比特流和加密密钥

    概括 重要提示&#xff1a;有关使用AMD Vivado™ Design Suite 2016.4 及更早版本进行 eFUSE 编程的重要更新&#xff0c;请参阅AMD设计咨询 68832 。 本应用说明介绍了使用AMD Vivado™ 设计套件生成加密比特流和加密密钥&#xff08;高级加密标准伽罗瓦/计数器模式 (AES-GCM)…...

    第三十四节:特征检测与描述-SIFT/SURF 特征 (专利算法)

    一、特征检测:计算机视觉的基石 在计算机视觉领域中,特征检测与描述是实现图像理解的核心技术。就像人类通过识别物体边缘、角点等特征来认知世界,算法通过检测图像中的关键特征点来实现: 图像匹配与拼接 物体识别与跟踪 三维重建 运动分析 其中,SIFT(Scale-Invariant F…...

    【AI】SpringAI 第二弹:基于多模型实现流式输出

    目录 一、基于多模型实现流式输出 1.1 什么是流式输出 1.2 多模型引入 1.3 代码实现 1.3.1 流式输出的API介绍 1.3.2 Flux 源码分析 二、了解 Reactor 模型 三、SSE 协议 一、基于多模型实现流式输出 1.1 什么是流式输出 流式输出(Streaming Output)是指数据在生成过程…...

    SQL语句执行问题

    执行顺序 select [all|distinct] <目标列的表达式1> AS [别名], <目标列的表达式2> AS [别名]... from <表名1或视图名1> [别名],<表名2或视图名2> [别名]... [where <条件表达式>] [group by <列名>] [having <条件表达式>] [ord…...

    模型量化AWQ和GPTQ哪种效果好?

    环境&#xff1a; AWQ GPTQ 问题描述&#xff1a; 模型量化AWQ和GPTQ哪种效果好? 解决方案&#xff1a; 关于AWQ&#xff08;Adaptive Weight Quantization&#xff09;和GPTQ&#xff08;Generative Pre-trained Transformer Quantization&#xff09;这两种量化方法的…...

    Github 2025-05-17 Rust开源项目日报 Top10

    根据Github Trendings的统计,今日(2025-05-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero General Public Li…...

    借助 CodeBuddy 打造我的图标预览平台 —— IconWiz 开发实录

    我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 想做一款自己的图标预览平台 这段时间我在做前端 UI 设计时&#xff0c;常常需要到处找图标素材&#xff0c;复…...

    KL散度 (Kullback-Leibler Divergence)

    KL散度&#xff0c;也称为相对熵 (Relative Entropy)&#xff0c;是信息论中一个核心概念&#xff0c;用于衡量两个概率分布之间的差异。给定两个概率分布 P ( x ) P(x) P(x) 和 Q ( x ) Q(x) Q(x)&#xff08;对于离散随机变量&#xff09;或 p ( x ) p(x) p(x) 和 q ( x …...

    【Linux网络】NAT和代理服务

    NAT 之前我们讨论了&#xff0c;IPv4协议中&#xff0c;IP地址数量不充足的问题。 原始报文途径路由器WAN口时&#xff0c;对报文中的源IP进行替换的过程&#xff0c;叫做NAT。 NAT技术当前解决IP地址不够用的主要手段&#xff0c;是路由器的一个重要功能&#xff1a; NAT能…...

    DeepSeek赋能电商,智能客服机器人破解大型活动人力困境

    1. DeepSeek 与电商客服结合的背景 1.1 电商行业客服需求特点 电商行业具有独特的客服需求特点&#xff0c;这些特点决定了智能客服机器人在该行业的必要性和重要性。 高并发性&#xff1a;电商平台的用户数量庞大&#xff0c;尤其是在促销活动期间&#xff0c;用户咨询量会…...

    Unity序列化字段、单例模式(Singleton Pattern)

    一、序列化字段 在Unity中&#xff0c;序列化字段是一个非常重要的概念&#xff0c;主要用于在Unity编辑器中显示和编辑类的成员变量&#xff0c;或者在运行时将对象的状态保存到文件或网络中。 1.Unity序列化字段的作用 在编辑器中显示和编辑字段&#xff1a;默认情况下&…...

    一个可拖拉实现列表排序的WPF开源控件

    从零学习构建一个完整的系统 推荐一个可通过拖拉&#xff0c;来实现列表元素的排序的WPF控件。 项目简介 gong-wpf-dragdrop是一个开源的.NET项目&#xff0c;用于在WPF应用程序中实现拖放功能&#xff0c;可以让开发人员快速、简单的实现拖放的操作功能。 可以在同一控件内…...

    hadoop.proxyuser.代理用户.授信域 用来干什么的

    在Hadoop的core-site.xml文件中存在三个可选配置&#xff0c;如下 <property><name>hadoop.proxyuser.root.hosts</name><value>*</value> </property> <property><name>hadoop.proxyuser.root.groups</name><value…...

    python 自动化教程

    文章目录 前言整数变量​字符串变量​列表变量​算术操作​比较操作​逻辑操作​if语句​for循环遍历列表​while循环​定义函数​调用函数​导入模块​使用模块中的函数​启动Chrome浏览器​打开网页​定位元素并输入内容​提交表单​关闭浏览器​发送GET请求获取网页内容​使…...

    C++学习:六个月从基础到就业——C++11/14:列表初始化

    C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;列表初始化 本文是我C学习之旅系列的第四十三篇技术文章&#xff0c;也是第三阶段"现代C特性"的第五篇&#xff0c;主要介绍C11/14中的列表初始化特性。查看完整系列目录了解更多内容。 引言 在C11之前&a…...