【Java编程进阶之路 06】深入探索:JDK、JRE与JVM的关系与差异

JDK、JRE与JVM:揭开Java运行环境的神秘面纱

在Java开发者的日常工作中,JDK、JRE和JVM这三个概念是不可或缺的。它们构成了Java应用程序的运行环境,但很多初学者可能对这三者的关系和差异感到困惑。本文旨在详细解析JDK、JRE和JVM之间的关系,帮助读者更好地理解Java的运行机制。

01 JDK:Java开发工具包

1.1 定义与重要性

JDK是Java开发工具包,它提供了开发、调试和运行Java应用程序所需的一切工具。无论是初学者还是经验丰富的开发者,JDK都是必不可少的。它是Java平台的核心,涵盖了Java编程语言的所有方面,从基本的编程工具到复杂的库和框架。

1.2 主要组件

  1. Java编译器(javac):JDK中最基本且最重要的工具之一,它负责将Java源代码(.java文件)编译成字节码(.class文件)。这些字节码文件是Java程序运行的基础。
  2. Java虚拟机(JVM):虽然JVM本身并不直接属于JDK,但JDK包含了对JVM的支持和集成。JVM是执行Java字节码的关键组件,它模拟了一个计算机硬件系统,使Java程序能够在不同的操作系统和硬件平台上运行。
  3. Java类库:JDK提供了丰富的Java类库,这些类库包含了大量预编译的类和接口,用于处理各种任务,如文件操作、网络编程、图形界面开发、数据库连接等。
  4. 调试工具(jdb):JDK还包含了一个强大的调试工具,可以帮助开发者在开发过程中定位和解决代码中的错误。
  5. 文档生成器(javadoc):这是一个根据Java源代码中的注释自动生成API文档的工具,对于代码维护和团队协作非常有帮助。

1.3 作用

JDK是Java开发的基础,它提供了完整的开发工具集,包括编译器、调试器、类库和更多。对于任何想要学习或从事Java开发的人来说,理解和掌握JDK是必不可少的。通过JDK,开发者可以更加高效、便捷地开发出高质量的Java应用程序。

02 JRE:Java运行环境

2.1 定义与重要性

JRE,全称Java Runtime Environment,即Java运行环境,是Java应用程序得以正确运行的关键组件。它包含了Java虚拟机(JVM)和Java核心类库,但不包括Java开发工具(如编译器和调试器)。这意味着JRE是Java程序运行时的最小环境,而JDK(Java开发工具包)则提供了开发、编译和调试Java应用程序所需的完整工具集。

2.2 主要组件

JRE(Java Runtime Environment,Java运行环境)是Java程序运行所必需的一组组件和库。以下是JRE的主要组件及其详细描述:

  1. Java虚拟机(JVM)

    • JVM是JRE的核心组件,负责执行Java程序中的字节码。它是跨平台的,意味着相同的Java程序可以在不同的操作系统上运行,只要这些系统上安装了相应版本的JRE。
    • JVM提供了内存管理、垃圾回收、多线程支持等核心功能,确保了Java程序的稳定、高效运行。
    • JVM还包含了一个即时编译器(JIT),它可以将热点代码(频繁执行的代码)编译成本地机器码,从而提高执行效率。
  2. Java类库

    • JRE包含了一套丰富的Java类库,这些类库提供了许多常用的功能和工具,如输入/输出处理、网络通信、图形界面开发、安全机制等。
    • 开发者可以直接使用这些类库中的类和接口,来简化开发过程,减少重复劳动。
    • 类库中的一些关键组件包括java.langjava.utiljava.io等包,它们提供了Java程序开发所需的基础功能。
  3. Java应用程序接口(API)

    • JRE中的API允许开发者访问底层系统功能和资源,同时隐藏了与特定操作系统或硬件平台相关的细节。
    • API提供了统一的接口来访问操作系统服务、文件系统、网络协议等,使得Java程序可以在不同的平台上无缝运行。
    • 一些关键的API包括Java网络编程API、Java数据库连接API(JDBC)等。
  4. Java应用程序启动器(Java Application Launcher)

    • 这是一个用于启动Java应用程序的工具,它负责加载和初始化JVM,并运行指定的Java程序。
    • 开发者可以通过命令行或其他方式使用Java应用程序启动器来运行Java程序。

需要注意的是,JRE并不包含开发工具(如编译器和调试器),它只是一个运行环境,用于执行已经编译好的Java程序。与JRE相对应的是JDK(Java Development Kit,Java开发工具包),它包含了开发Java程序所需的所有工具和库。

总的来说,JRE为Java程序的运行提供了一个稳定、可靠的环境,通过JVM、类库、API和应用程序启动器等组件,它确保了Java程序能够在不同的操作系统上顺利运行。

2.3 作用

JRE的主要作用是提供一个稳定、可靠的运行环境,使得Java应用程序能够在不同的操作系统和硬件平台上正确运行。它确保了Java字节码的正确解释和执行,同时提供了必要的类库支持,使得开发者能够利用这些类库来简化开发过程,提高开发效率。

03 JVM:Java虚拟机

3.1 定义与重要性

JVM是一种用于计算设备的规范,它提供了一个虚构出来的计算机环境,用于执行Java字节码。这意味着Java程序可以在任何安装了JVM的设备上运行,而无需考虑底层硬件和操作系统的差异。这种特性使得Java成为了一种非常流行的跨平台编程语言。

3.2 主要组件

  1. 类加载子系统(Class Loader Subsystem)

    • 负责加载Java类文件到内存中。当运行一个Java程序时,JVM需要加载所需的类文件,这些文件通常是以.class为扩展名的文件或从.jar文件中提取的类。
    • 类加载器不仅加载类的字节码文件,还负责验证这些字节码的正确性,确保它们符合JVM规范。
    • 加载的类信息被存放在方法区中,供执行引擎和其他组件使用。
  2. 堆(Heap)

    • 是Java对象的主要存储区域。所有通过new关键字创建的Java对象实例和数组都分配在堆上。
    • 堆内存由JVM自动管理,包括分配和回收。当不再需要对象时,垃圾回收器会自动回收其占用的内存空间。
    • 堆内存的大小可以通过JVM启动参数进行配置,如使用-Xms-Xmx参数设置堆内存的初始大小和最大大小。
  3. 方法区(Method Area)

    • 是被所有线程共享的内存区域,用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
    • 方法区包含了类的构造方法、接口定义以及运行时常量池等信息。
    • 在JDK 1.7及之前版本中,运行时常量池位于方法区中;但在JDK 1.8及以后的版本中,运行时常量池被移到了堆内存中。
  4. 栈(Stack)

    • 每个线程都有一个私有的栈,用于存储方法调用和执行的相关信息。栈中的每个元素称为一个栈帧(Stack Frame),每个栈帧对应一个方法调用。
    • 栈的主要作用是保存方法执行过程中的局部变量、操作数栈、动态链接和方法出口等信息。
    • 当一个方法被调用时,JVM会为其创建一个新的栈帧并压入栈中;当方法执行完毕后,对应的栈帧会被弹出栈并释放内存。
  5. 本地方法栈(Native Method Stack)

    • 与栈类似,但用于支持native方法的执行。当Java程序调用本地(native)方法时,这些方法的执行栈会存放在本地方法栈中。
    • 本地方法通常是用其他语言(如C或C++)编写的,并通过JNI(Java Native Interface)与Java程序进行交互。
  6. 程序计数器(Program Counter)

    • 是一个较小的内存空间,用于存储指向下一条指令的地址。它是每个线程私有的,用于控制多线程环境下程序的执行流程。
    • 程序计数器由执行引擎读取,以确定下一条需要执行的指令。由于程序计数器只存储下一条指令的地址,因此其空间几乎可以忽略不计。
  7. 直接内存(Direct Memory)

    • 直接内存是在Java堆外的、直接向系统申请的内存空间。它允许Java程序直接访问操作系统级别的内存,从而提高了某些操作的性能。
    • 直接内存的使用场景通常包括频繁读写操作、大数据量处理等。出于性能的考虑,在这些场合下使用直接内存可能会更加高效。
    • 直接内存的管理和回收也由JVM的垃圾回收器负责。
  8. 垃圾回收器(Garbage Collector)

    • 负责自动管理堆内存、方法区和直接内存中的对象。它会自动回收不再使用的对象占用的内存空间,以防止内存泄漏和内存溢出。
    • JVM提供了多种垃圾回收算法和策略,开发者可以根据应用的需求选择合适的垃圾回收器。
  9. 执行引擎(Execution Engine)

    • 负责执行虚拟机的字节码。虚拟机会使用即时编译技术(Just-In-Time Compilation, JIT)将方法编译成本地机器码后再执行。
    • 执行引擎还负责解释命令并交由操作系统执行。在执行过程中,它会与程序计数器、栈和本地方法栈等组件进行交互。

这些组件共同构成了JVM的核心架构,为Java程序的运行提供了稳定、可靠的环境。

3.3 特点

  1. 跨平台性:这是JVM最为显著的特点之一。JVM通过在实际的计算机上仿真模拟各种计算机功能,为Java程序提供了一个虚构的计算机环境。这意味着Java程序只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。这种跨平台性使得Java成为一种非常流行的编程语言,特别适用于需要在不同操作系统和硬件平台上运行的应用程序。
  2. 安全性:JVM提供了一套完善的安全机制,确保Java程序的安全运行。其中包括字节码验证,确保加载的类文件信息符合Java虚拟机规范,没有安全漏洞。此外,JVM还提供了访问控制机制,防止恶意代码对系统资源的非法访问。
  3. 动态性:JVM具有动态加载和卸载类的能力。这意味着在运行时,JVM可以根据需要加载或卸载类,实现代码的动态加载和执行。这种动态性为Java程序提供了很大的灵活性,使其能够适应不同的运行环境和需求。
  4. 高效性:JVM通过即时编译(JIT)技术,将热点代码编译成本地机器码执行,提高了程序的执行效率。此外,JVM的垃圾回收器自动管理内存,回收不再使用的对象占用的内存空间,防止了内存泄漏和内存溢出,确保了程序的稳定运行。
  5. 结构完善:JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。这使得JVM能够模拟计算机的各种功能,为Java程序提供一个完整的运行环境。

综上所述,JVM的特点主要包括跨平台性、安全性、动态性、高效性和结构完善性。这些特点使得JVM成为Java语言成功的关键之一,也为Java程序的运行提供了稳定、可靠的环境。

3.4 执行过程

JVM的执行过程详细描述

JVM(Java Virtual Machine)的执行过程可以分为几个关键步骤,这些步骤确保了Java程序的正确运行。下面是对JVM执行过程的详细描述:

1. 加载(Loading)

  • 类加载器(Class Loader):JVM首先通过类加载器来加载Java类文件(.class文件或.jar文件中的类)。类加载器的作用是将类的字节码文件加载到JVM中,并将其转换为可以被JVM执行的结构。
  • 字节码验证:加载过程中,JVM会验证字节码文件的信息是否符合Java虚拟机规范,确保被加载的类信息的正确性。

2. 链接(Linking)

  • 验证(Verification):在链接阶段,JVM会再次验证被加载的类信息,确保它们符合Java语言规范,没有安全方面的问题。
  • 准备(Preparation):JVM为类的静态变量分配内存,并设置默认的初始值。
  • 解析(Resolution):将符号引用转换为直接引用,比如将类或方法的全限定名转换为实际的内存地址。

3. 初始化(Initialization)

  • 在这个阶段,JVM执行类的初始化方法(()方法),为类的静态变量赋予正确的初始值。

4. 执行(Execution)

  • 方法区(Method Area):一旦类被加载、链接和初始化,它的方法就会被放到方法区中。这是JVM内存中的一个区域,用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  • 执行引擎(Execution Engine):JVM的执行引擎读取方法区中的指令,并执行这些指令。执行过程中,JVM会根据指令的需要,操作堆内存、栈内存等。

5. 内存管理

  • 堆内存(Heap Memory):堆内存用于存储Java对象实例,这些对象是通过new关键字创建的。JVM的垃圾回收器会自动管理堆内存,回收不再使用的对象占用的内存空间。
  • 栈内存(Stack Memory):每个线程都有一个私有的栈,用于存储方法调用和执行的相关信息。栈中的每个元素称为一个栈帧(Stack Frame),每个栈帧对应一个方法调用。

6. 垃圾回收(Garbage Collection)

  • JVM的垃圾回收器负责自动管理内存,回收不再使用的对象占用的内存空间。这样可以防止内存泄漏和内存溢出,确保程序的稳定运行。

7. 卸载(Unloading)

  • 当一个类不再被使用时,它的类加载器可能会卸载这个类,释放其占用的资源。但这并不总是发生,因为JVM规范没有强制要求类加载器必须卸载类。

综上所述,JVM的执行过程涉及到了类的加载、链接、初始化,以及方法的执行和内存管理等多个方面。这个过程确保了Java程序的正确、高效和安全运行。

04 JDK、JRE与JVM的关系

JDK、JRE与JVM之间的关系可以分为以下几个关键点进行详细描述:

4.1 定义与功能

  • JDK(Java Development Kit):JDK是Java开发者的主要工具包,它包含了JRE(Java运行环境)以及Java开发工具,如编译器(javac)和调试器(jdb)等。JDK主要用于开发Java应用程序,它提供了编译、运行和调试Java程序所需的所有工具。
  • JRE(Java Runtime Environment):JRE是Java程序的运行环境,它包含了JVM(Java虚拟机)以及Java类库。JRE的主要作用是提供Java程序运行所需的运行时环境,使得开发者能够在不同的操作系统上运行Java程序。
  • JVM(Java Virtual Machine):JVM是Java程序的核心运行环境,它负责解释和执行Java字节码。JVM具有跨平台性,能够在不同的操作系统上运行相同的Java程序。

4.2 关系与层次

  • JVM与JRE的关系:JVM是JRE的核心组件,JRE包含了JVM以及Java类库。JVM提供了Java程序的运行环境,而Java类库则提供了丰富的功能和工具,使得开发者能够更方便地开发Java程序。
  • JRE与JDK的关系:JRE是JDK的一部分,JDK包含了JRE以及Java开发工具。JDK是开发Java程序的主要工具包,而JRE则是运行Java程序所必需的运行时环境。
  • 三者之间的层次关系:从层次结构上看,JDK是最顶层,它包含了JRE;而JRE又包含了JVM。这种层次关系体现了Java平台的构建原则,即“一次编写,到处运行”。

4.3 作用与重要性

  • JVM的作用:JVM是Java程序的核心运行环境,它负责解释和执行Java字节码。JVM的跨平台性使得Java程序能够在不同的操作系统上运行,而无需对代码进行任何修改。
  • JRE的作用:JRE提供了Java程序运行所需的运行时环境,包括JVM和Java类库。JRE使得开发者能够在不同的操作系统上运行Java程序,而无需关心底层操作系统的细节。
  • JDK的作用:JDK是Java开发者的主要工具包,它提供了开发Java程序所需的所有工具和库。JDK使得开发者能够更方便地编写、编译、调试和运行Java程序。

综上所述,JDK、JRE和JVM是Java平台的三个重要概念,它们之间的关系紧密而有序。JDK包含了JRE和Java开发工具,JRE包含了JVM和Java类库,而JVM则是Java程序的核心运行环境。这种层次关系使得Java程序能够在不同的操作系统上运行,而无需对代码进行任何修改,从而实现了“一次编写,到处运行”的目标。

05 命令行中的JDK、JRE与JVM

在命令行中,JDK(Java Development Kit)、JRE(Java Runtime Environment)和JVM(Java Virtual Machine)各自发挥着不同的作用,并提供了特定的命令来执行各种任务。以下是关于这三个组件在命令行中的详细描述以及相关的命令:

5.1 JDK(Java Development Kit)

编译和打包

  • javac:用于编译Java源代码文件(.java)为字节码文件(.class)。

    javac HelloWorld.java
    
  • jar:用于创建、查看或提取JAR文件。

    jar cvf HelloWorld.jar HelloWorld.class
    

调试

  • jdb:是Java的调试器,允许开发者在命令行中调试Java程序。

    jdb HelloWorld
    

文档生成

  • javadoc:从Java源代码中提取注释并生成API文档。

    javadoc HelloWorld.java
    

其他工具

  • javap:显示Java类文件中的信息,如字节码、本地变量表、行号表等。

    javap HelloWorld
    
  • jstack:生成Java线程堆栈跟踪,用于诊断线程问题。

    jstack [pid]
    

5.2 JRE(Java Runtime Environment)

执行Java程序

  • java:用于执行JAR文件或包含main方法的类。

    java -jar HelloWorld.jar
    

    java HelloWorld
    

JVM命令行选项

  • 可以通过java命令传递各种JVM选项来调整Java程序的运行配置,例如:

    java -Xmx512m -Xms64m HelloWorld
    

    上述命令设置了最大堆内存为512MB,初始堆内存为64MB。

5.3 JVM(Java Virtual Machine)

JVM参数和诊断工具

  • jps:显示指定系统内的所有Java虚拟机进程。

    jps
    
  • jinfo:显示Java虚拟机的配置信息,包括Java系统属性和JVM命令行参数。

    jinfo -flags [pid]
    
  • jstat:用于监视Java虚拟机各种运行状态信息,如类加载、垃圾收集、内存使用等。

    jstat -gc [pid]
    
  • jmap:生成Java堆转储映射文件,通常用于内存泄漏分析。

    jmap -dump:format=b,file=heap.bin [pid]
    
  • jhat:与jmap配合使用,分析堆转储文件。

    jhat heap.bin
    
  • jstack:生成Java线程的堆栈跟踪,用于诊断线程问题。

    jstack [pid]
    
  • jconsole:内置Java性能分析器,可以从命令行或在GUI shell中运行,用于监控Java应用程序性能和跟踪Java中的代码。

    jconsole
    

在命令行中使用这些工具和命令,开发者可以轻松地编译、运行、调试和监控Java程序。同时,通过调整JVM参数,还可以优化程序的性能和资源使用。

06 总结

JDK、JRE和JVM是Java技术的核心组件,它们在构建和运行Java应用程序中起着至关重要的作用。简要来说,JDK是Java开发工具包,包含了JRE和一系列开发工具,如编译器和调试器,主要用于开发Java程序。JRE,即Java运行环境,提供了Java程序运行所需的基本环境,包括JVM和Java类库,使Java程序能够在不同平台上运行。而JVM,即Java虚拟机,是JRE的核心部分,负责解释和执行Java字节码,实现了Java的跨平台特性。

这三者之间的关系紧密而有序。JDK包含了JRE,因此开发者在安装JDK后无需单独安装JRE即可运行Java程序。JRE又包含了JVM,提供了Java程序运行的基础环境。这种层次结构使得Java程序能够“一次编写,到处运行”,即无需修改源代码即可在不同操作系统上运行。

总之,JDK、JRE和JVM共同构成了Java技术的核心,它们之间的关系和差异在于功能和角色的不同。JDK侧重于开发,JRE侧重于运行,而JVM则是实现跨平台运行的关键。这三者相互协作,使得Java成为一种强大而灵活的编程语言。

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

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

相关文章

代码随想录算法刷题训练营day27:LeetCode(39)组合总和、LeetCode(40)组合总和 II、LeetCode(131)分割回文串

代码随想录算法刷题训练营day27:LeetCode(39)组合总和、LeetCode(40)组合总和 II、LeetCode(131)分割回文串 LeetCode(39)组合总和 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List;clas…

【论文笔记】Attention Is All You Need

【论文笔记】Attention Is All You Need 文章目录 【论文笔记】Attention Is All You NeedAbstract1 Introduction2 Background补充知识:软注意力 soft attention 和硬注意力 hard attention?补充知识:加法注意力机制和点乘注意力机制Extende…

计算机硬件 7.3测试优化升级

第三节 测试 优化 升级 一、测试 1.测试方法:考机法、仪器测试法、软件测试法。 2.测试软件:CPU—Z、GPU—Z、PCMark、Hwinfo、Super PI。 二、优化 1.分类:硬盘优化、操作系统优化。 2.硬盘优化 目的:提高读写速度、增大可用…

11.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏接收网络数据包的操作

内容参考于:易道云信息技术研究院VIP课 上一个内容:接管游戏发送数据的操作 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:8256eb53e8c16281bc1a29cb8d26d352bb5bbf4c 代…

在Windows中安装PyTorch

文章目录 1. 创建虚拟环境2. 检查显卡版本和CUDA3. 下载链接4. 下载5. 等待6. 检测 1. 创建虚拟环境 具体查看我之前写的 《在Windows中利用Python的venv和virtualenv创建虚拟环境》 2. 检查显卡版本和CUDA 这种情况是需要电脑上有单独的英伟达的显卡、或者英伟达的显卡和集显…

NoSQL数据库介绍

目录 一、发展历史 二、什么是NoSQL? 三、为什么使用NoSQL? 四、NoSQL vs. RDBMS 五、NoSQL的四种类型 键值存储 文档存储 列式存储 图形存储 六、NoSQL的优缺点 七、NoSQL的特点 灵活的可扩展性 灵活的数据模型 与云计算紧密融合 大数据量…

【Java程序设计】【C00324】基于Springboot的高校疫情防控管理系统(有论文)

基于Springboot的高校疫情防控管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的高校疫情防控系统,本系统有管理员、学校管理员、学院管理员、教师以及学生五种角色; 管理员&#x…

2732: 【C2】【排序】钻石收集者

题目描述 总是喜欢亮闪闪的东西的奶牛Bessie空闲时有挖掘钻石的爱好。她收集了N颗不同大小的钻石并且她希望将其中一些钻石放在谷仓展览室的一个盒子里。由于Bessie希望盒子里面的钻石在大小上相对接近,,她不会将大小相差大于K的钻石放在盒子里。 现在…

MySQL 的数据库操作,利用Spring Boot实现MySQL数据库的自动创建

执行 show databases; 命令可以查看当前数据库的所有数据库。 注意在 MySQL 客户端执行 SQL 语句的时候要带上分号 ; 并按下 enter 键,不然 MySQL 会认为你还没有输入完,会换一行继续等待你输入。 OK,像上面截图中的 information_schema、mys…

3D Gaussian splatting 协方差矩阵 球谐函数 简单理解

3D Gaussian splatting 是一种图形和视觉处理技术,常用于体积渲染、点云渲染和其他应用中,以便对数据进行平滑或重建。在这个上下文中,高斯分布(或高斯“splat”)用于表示单个数据点(如一个点云中的点&…

leetcode 2.28

Leetcode hot100 动态规划1.最大子数组和2.不同路径3.最小路径和4. 爬楼梯5. 杨辉三角6.打家劫舍 动态规划 1.最大子数组和 最大子数组和 动态规划: 按照四个步骤求解: 1)确定状态:以n代表第n个元素为末尾的最大子序列和 最后一…

InnoDB高级特性篇(2)-InnoDB的日志系统详解

InnoDB是MySQL数据库中最常用的存储引擎之一,其强大之处在于其完善的日志系统。本文将详细介绍InnoDB的日志系统。 在数据库中,日志是一种记录数据库操作的机制,它可以帮助恢复数据、保证数据一致性以及提高系统性能。InnoDB的日志系统由多个…

第二周opencv

一、边缘检测算子 边缘检测算子是用于检测图像中物体边界的工具。边缘通常表示图像中灰度值或颜色发生显著变化的地方。边缘检测有助于识别图像中的物体形状、轮廓和结构。这些算子通过分析图像的灰度或颜色梯度来确定图像中的边缘。 1、Roberts 算子 通过局部差分计算检测边缘…

(PWM呼吸灯)合泰开发板HT66F2390-----点灯大师

前言 上一篇文章相信大家已经成为了点灯高手了,那么进阶就是成为点灯大师 实现PWM呼吸灯 接下来就是直接的代码讲解了,不再讲PWM原理的 这里部分内容参考了另一个博主的文章 合泰杯——合泰单片机工程7之PWM输出 如果有小伙伴不理解引脚设置和delay函数…

Kubeadmin方式部署Calico网络模式的K8s集群

目录 1.环境准备 2.配置内核参数 3.配置ntp时间服务器 4.配置持久化日志目录 5.升级物理机内核 6.配置ipvs服务 7.安装docker 8.安装kubeadm、kubectl、kubelet 9.导入k8s组件基础镜像 10.k8s初始化配置 11.配置calico网络 12.完成部署 1.环境准备 ###方案中涉及的…

在 GitHub 上下载了一个 C++ 工程,并且该工程包含了 CMakeLists.txt 文件,该如何编译这个工程呢?

如果你在 GitHub 上下载了一个 C 工程,并且该工程包含了 CMakeLists.txt 文件,你可以按照以下步骤来编译这个工程: 安装 CMake: 首先,确保你已经安装了 CMake。如果没有安装,你可以从 CMake 官网 下载并安装…

华为数通方向HCIP-DataCom H12-821题库(单选题:501-520)

第501题 三台交换机运行RSTP协议,拓扑和配置情况如图所示。那么以下关于根桥的描述,正确的是哪一项? A、根桥是SWA B、根桥是SWB C、根桥是SWC D、根桥无法确定 参考答案:A 第502题 在华为设备中,以下哪一个命令可以实现BFD与静态默认路由联动? A、ip route-static 0.…

mysql数据库优化及sql调优,Java后端社招面试经历

Redis 什么是Redis?Redis的数据类型?使用Redis有哪些好处?Redis相比Memcached有哪些优势?Memcache与Redis的区别都有哪些?Redis是单进程单线程的?一个字符串类型的值能存储最大容量是多少?Redis的持久化机制是什么?各自的优缺点?Redis常见性能问题和解决方案:redis过…

docker容器配置mysql5.7主从复制

介绍 本文将通过docker创建3个mysql数据库容器,实现数据库主从复制功能,三个数据库容器分别为主库mysql-master:3307,从库mysql-slave-01:3308,mysql-slave-02:3309。使用的是mysql5.7版本 1. 拉取mongo镜像 docker pull mysql…

万能引用、完美转发及其关系

万能引用 为什么需要万能引用。首先看下面三个函数模板&#xff0c;分别输入左值和右值&#xff0c;有哪些可以通过编译。 // 左值引用 template <typename T> void fun(T& x){return ;}// 常量引用 template <typename T> void fun1(const T& x){return…