完整的类在JVM中的生命周期详解
首先给出一个示例代码:
示例的目标是展示一个多功能的类结构,包含继承、接口实现、静态成员、本地方法、线程安全等特性,同时模拟一个简单的“计算器”场景,计算并管理数字。(尽量将所有的 Java 组件和关键字都给出,完整给出全面的生命周期)
示例代码及其作用
这个示例实现了一个计算器类 Calculator
,它继承自一个抽象父类 BaseCalculator
,并实现了一个接口 Operable
。它包含:
- 静态变量和方法来跟踪计算次数。
- 本地方法(假设由 C/C++ 实现)来执行特殊计算。
- 同步方法确保多线程安全。
- 嵌套类和枚举用于扩展功能。
- 子类
AdvancedCalculator
进一步扩展功能。
以下是带详细注释的完整代码:
package com.example;// 抽象父类,提供基础计算功能
abstract class BaseCalculator {// 受保护的实例变量,表示基础值protected int baseValue = 10;// 抽象方法,要求子类实现具体的计算逻辑abstract int calculateBase(int input);// 普通方法,显示基础值void displayBase() {System.out.println("基础值: " + baseValue);}
}// 接口,定义可操作的计算行为
interface Operable {// 接口方法,执行加法操作int add(int a, int b);
}// 主类:计算器类,继承 BaseCalculator 并实现 Operable 接口
public class Calculator extends BaseCalculator implements Operable {// 静态常量,记录最大允许的计算次数public static final int MAX_CALCULATIONS = 100;// 静态变量,跟踪全局计算次数private static int calculationCount = 0;// 实例变量,表示当前计算结果,volatile 确保线程可见性private volatile int currentResult = 0;// transient 变量,不会序列化,用于临时存储数据private transient String tempLog = "Calculation started";// 静态初始化块,在类加载时执行一次static {System.out.println("已加载Calculator类。最大允许的计算次数: " + MAX_CALCULATIONS);}// 实例初始化块,每次创建对象时执行{System.out.println("新建Calculator实例。");calculationCount++; // 增加计算次数}// 构造方法,初始化当前结果public Calculator(int initialValue) {super(); // 调用父类构造方法this.currentResult = initialValue;}// 静态方法,返回当前的计算次数public static int getCalculationCount() {return calculationCount;}// 本地方法,假设由 C/C++ 实现,用于特殊计算(这里仅声明)public native int specialCalculation(int input);// 重写抽象方法,计算基于 baseValue 的结果@Overrideint calculateBase(int input) {return baseValue + input;}// 实现接口方法,执行加法操作@Overridepublic int add(int a, int b) {currentResult = a + b;return currentResult;}// 同步方法,确保多线程环境下安全更新结果public synchronized void multiply(int factor) {currentResult *= factor;System.out.println("乘法结果: " + currentResult);}// 获取当前结果的方法public int getCurrentResult() {return currentResult;}// 嵌套静态类,用于日志记录static class CalculationLogger {// 日志记录方法void log(String message) {System.out.println("Log: " + message);}}// 嵌套枚举,表示计算类型enum OperationType {ADD, MULTIPLY, SPECIAL}// 主方法,测试计算器功能public static void main(String[] args) {// 创建计算器实例Calculator calc = new Calculator(5);// 测试继承的父类方法calc.displayBase();// 测试抽象方法实现System.out.println("基础计算结果: " + calc.calculateBase(20));// 测试接口方法System.out.println("加法结果: " + calc.add(10, 15));// 测试同步方法calc.multiply(2);// 测试静态方法System.out.println("总计算次数: " + Calculator.getCalculationCount());// 测试嵌套类CalculationLogger logger = new CalculationLogger();logger.log("Calculation completed");// 测试枚举OperationType op = OperationType.ADD;System.out.println("操作类型: " + op);// 检查实例类型if (calc instanceof Calculator) {System.out.println("实例是计算器");}}
}// 子类:高级计算器,扩展 Calculator 的功能
class AdvancedCalculator extends Calculator {// 子类构造方法public AdvancedCalculator(int initialValue) {super(initialValue);}// 子类新增方法,计算平方public int square() {int result = getCurrentResult() * getCurrentResult();System.out.println("平方的结果: " + result);return result;}
}
代码作用和功能说明
-
类结构和继承:
BaseCalculator
是一个抽象父类,提供基础值和方法,模拟计算器的基本功能。Calculator
继承BaseCalculator
,并实现Operable
接口,提供加法等操作。AdvancedCalculator
是Calculator
的子类,增加了平方计算功能。
-
静态成员:
MAX_CALCULATIONS
是静态常量,限制计算次数(示例中未强制执行,仅展示概念)。calculationCount
是静态变量,记录创建的计算器实例数。getCalculationCount()
是静态方法,提供全局访问。
-
本地方法:
specialCalculation()
使用native
关键字,假设由本地代码实现特殊计算(实际需要 JNI 实现)。
-
线程安全:
multiply()
使用synchronized
确保多线程环境下安全更新currentResult
。volatile
修饰currentResult
,保证线程间可见性。
-
嵌套类和枚举:
CalculationLogger
是静态嵌套类,用于记录计算日志。OperationType
是枚举,定义支持的操作类型。
-
功能实现:
- 支持加法(
add
)、乘法(multiply
)、平方(square
)等计算。 - 提供结果查询(
getCurrentResult
)和计算次数统计(getCalculationCount
)。 - 通过
main
方法测试所有功能。
- 支持加法(
输出示例
运行 main
方法的输出(specialCalculation
未实现):
已加载Calculator类。最大允许的计算次数:100
新建Calculator实例。
基础值:10
基础计算结果:30
加法结果:25
乘法结果:50
总计算次数:1
Log: Calculation completed
操作类型: ADD
实例是计算器
下面详细分析 Java 8 的环境下,上面 Calculator
类从创建到被垃圾回收(GC)销毁的完整流程,涵盖 PC 寄存器、Java 虚拟机栈、Java 堆、方法区、运行时常量池和本地方法栈六个关键部分。我会结合 JVM 的运行时数据区,逐步说明每个阶段的内存分配和回收过程,并尽量贴近底层实现(基于 HotSpot JVM 的典型行为)。
1. 类的加载与初始化(方法区和运行时常量池)
流程概述
在 Calculator
类首次使用(如 Calculator calc = new Calculator(5);
)时,JVM 会通过类加载器加载该类及其相关类(BaseCalculator
, Operable
, AdvancedCalculator
等)。这涉及到方法区和运行时常量池的初始化。
底层原理
-
类加载:
- JVM 使用类加载器(如
AppClassLoader
)加载Calculator.class
文件。 - 类文件被解析后,JVM 在方法区(Java 8 中为 Metaspace)分配内存,存储类的元数据,包括:
- 类名(
com.example.Calculator
) - 父类(
BaseCalculator
) - 接口(
Operable
) - 字段信息(
MAX_CALCULATIONS
,calculationCount
等) - 方法表(
add
,multiply
,specialCalculation
等) - 字节码(每个方法的指令序列)。
- 类名(
- JVM 使用类加载器(如
-
运行时常量池:
- 方法区中的一部分逻辑区域为运行时常量池(Runtime Constant Pool),存储类文件中
constant_pool
表的运行时表示。 - 例如,
MAX_CALCULATIONS = 100
的值 100、字符串"已加载Calculator类..."
、方法引用(如System.out.println
)等都被放入常量池。 - 在 HotSpot JVM 中,运行时常量池的实现依赖于 Metaspace 中的
ConstantPool
对象。
- 方法区中的一部分逻辑区域为运行时常量池(Runtime Constant Pool),存储类文件中
-
静态初始化:
- 类加载完成后,JVM 执行
<clinit>
方法(类初始化方法),运行静态初始化块:static {System.out.println("已加载Calculator类。最大允许的计算次数: " + MAX_CALCULATIONS); }
- 这会在方法区中为
calculationCount
分配内存并初始化为 0,并在 Java 堆中分配字符串对象(常量池引用)。
- 类加载完成后,JVM 执行
源代码层面
- HotSpot JVM 的
InstanceKlass
类表示方法区中的类元数据。 ConstantPool
对象管理运行时常量池,存储符号引用(如字段和方法的CONSTANT_Fieldref_info
)。
2. 对象创建(Java 堆和 Java 虚拟机栈)
流程概述
当执行 Calculator calc = new Calculator(5);
时,JVM 创建 Calculator
对象实例,并分配栈帧来执行构造方法。
底层原理
-
Java 堆分配:
- JVM 在堆的年轻代(Young Generation)中的 Eden 区为
Calculator
对象分配内存。 - 对象包含实例字段:
baseValue
(继承自BaseCalculator
)currentResult
tempLog
- 对象头(Object Header)包含元数据,如指向方法区中
Calculator
类元信息的指针(klass
指针)。
- JVM 在堆的年轻代(Young Generation)中的 Eden 区为
-
Java 虚拟机栈:
- 为调用
Calculator(int)
构造方法,JVM 在当前线程的栈中推送一个新的栈帧(Frame)。 - 栈帧结构:
- 局部变量表:存储
this
(对象引用)和参数initialValue
。 - 操作数栈:用于计算(如
this.currentResult = initialValue
)。 - 常量池引用:指向运行时常量池中构造方法的相关条目。
- 局部变量表:存储
- 执行流程:
super();
调用BaseCalculator
的构造方法,分配一个父类栈帧。this.currentResult = initialValue;
将 5 存入堆中的对象字段。- 实例初始化块
{}
执行,更新calculationCount
。
- 为调用
-
PC 寄存器:
- PC(Program Counter)寄存器记录当前线程正在执行的字节码指令地址。
- 例如,在构造方法中,PC 指向
invokespecial
(调用super()
)或putfield
(设置currentResult
)指令。
源代码层面
- HotSpot 的
oopDesc
表示堆中的对象,markOop
是对象头。 frame
类管理栈帧,interpreter
模块执行字节码。
3. 方法调用(Java 虚拟机栈和本地方法栈)
流程概述
执行 calc.add(10, 15);
和 calc.specialCalculation(20);
时,JVM 分别调用普通方法和本地方法。
底层原理
-
普通方法调用(Java 虚拟机栈):
- 为
add(int, int)
创建栈帧:- 局部变量表:
this
、a
(10)、b
(15)。 - 操作数栈:计算
a + b
,结果存入currentResult
。
- 局部变量表:
- PC 寄存器更新为
add
方法的字节码地址。 - 方法返回后,栈帧弹出。
- 为
-
本地方法调用(本地方法栈):
- 调用
specialCalculation(int)
时,JVM 使用 Java Native Interface(JNI)。 - 在本地方法栈(Native Method Stack)分配栈帧,存储 JNI 调用参数。
- PC 寄存器值未定义(本地方法不由 JVM 解释执行)。
- JNI 调用本地库(如
.dll
或.so
文件),假设返回结果。
- 调用
-
同步方法(Java 虚拟机栈):
- 调用
multiply(2)
时,栈帧包含同步锁信息。 - JVM 使用对象头的监视器(Monitor)实现
synchronized
,确保线程安全。
- 调用
源代码层面
InterpreterRuntime::resolve_invoke
解析方法调用。jni.h
和JVM_ENTRY
宏处理本地方法栈。
4. 对象使用(Java 堆和方法区交互)
流程概述
对象 calc
被使用时,JVM 通过堆和方法区的协作执行逻辑。
底层原理
- 堆中的对象:
currentResult
更新为 25(add
)、50(multiply
)。tempLog
指向堆中的字符串对象(若非常量池引用)。
- 方法区:
- 方法字节码从方法区加载到栈帧执行。
- 嵌套类
CalculationLogger
和枚举OperationType
的元数据也在方法区。
5. 垃圾回收(GC)过程(Java 堆)
流程概述
当 calc
不再被引用(如 calc = null;
或离开作用域),JVM 的垃圾回收器(GC)回收其内存。
底层原理
-
可达性分析:
- GC 从根集(GC Roots)开始标记:
- 栈中的局部变量(如
calc
)。 - 方法区中的静态变量(如
calculationCount
)。
- 栈中的局部变量(如
- 若
calc
无引用,则标记为不可达。
- GC 从根集(GC Roots)开始标记:
-
年轻代回收(Minor GC):
calc
在 Eden 区创建,若仍存活,可能晋升到 Survivor 区。- Minor GC 使用复制算法(Copying Algorithm):
- 将 Survivor 中的存活对象移动到另一个 Survivor 或老年代。
- 清空 Eden 和当前 Survivor。
-
老年代回收(Major GC):
- 若
calc
存活多次 Minor GC,晋升到老年代(Tenured Generation)。 - 使用标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)算法:
- 标记存活对象。
- 清除不可达对象(如
calc
),回收内存。
- 若
-
Metaspace(方法区)回收:
- 若
Calculator
类不再被使用(无实例且类加载器可回收),Metaspace 中的元数据和常量池条目被回收。 - Java 8 中 Metaspace 使用本地内存,受
-XX:MaxMetaspaceSize
控制。
- 若
源代码层面
GenCollectedHeap
管理堆的分代。G1CollectedHeap
(默认 GC)实现分代回收。MetaspaceUtils
处理 Metaspace 回收。
6. 完整流程总结
- 方法区和常量池:类加载,元数据和常量存储。
- Java 堆:对象在 Eden 区创建,字段存储实例数据。
- Java 虚拟机栈:栈帧执行构造方法和普通方法。
- PC 寄存器:跟踪指令地址。
- 本地方法栈:执行
native
方法。 - GC 销毁:对象不可达后,Minor/Major GC 回收堆内存,Metaspace 回收类元数据。
相关文章:
完整的类在JVM中的生命周期详解
首先给出一个示例代码: 示例的目标是展示一个多功能的类结构,包含继承、接口实现、静态成员、本地方法、线程安全等特性,同时模拟一个简单的“计算器”场景,计算并管理数字。(尽量将所有的 Java 组件和关键字都给出&am…...
大数据学习栈记——HBase操作(shell java)
本文介绍HBase在shell终端的常见操作以及如何利用java api操作HBase,操作系统:Ubuntu24.04 参考: https://blog.51cto.com/u_16099228/8016429 https://blog.csdn.net/m0_37739193/article/details/73618899 https://cloud.tencent.com/d…...
【商城实战(65)】退换货流程全解析:从前端到后端的技术实现
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…...
改进BM25稀疏检索和BGE稠密检索
改进BM25稀疏检索和BGE稠密检索 检索算法层面 混合检索策略优化 自适应加权融合:在BM25和BGE等混合检索时,根据查询文本的特征(如长度、专业术语占比等)动态调整两者的权重。例如,对于包含大量专业术语的查询,增加BGE的权重;对于关键词明确的简单查询,增加BM25的权重。…...
WPS二次开发系列:以自动播放模式打开PPT文档
在前面文章中 android 调用wps打开文档并感知保存事件 介绍了如何使用WPS SDK打开文档,那么我们是否能够实现在打开WPS 文档的时候能够传递一些参数来控制打开文档的行为呢,经过研究WPS SDK相关文档和API,最终实现了 以自动播放方式打开PPT文…...
当AI重构编程范式:Java 24的进化逻辑与技术深水区的战略突围
一、语言进化的底层密码:从“工具适配”到“定义规则” 在2025年3月19日发布的Java 24中,Oracle以"30周年技术宣言"的姿态展示了编程语言进化的新范式。该版本不仅包含模式匹配、结构化并发等21项JEP特性,更通过后量子加密、AI原生…...
air780eq 阿里云
硬件:APM32F030C8 Air 780eq 参考文档: 合宙780E-4G模块通过AT指令连接到阿里云平台,实现信息的收发_air780e上传阿里云属性值at命令-CSDN博客 阿里云 - atair780eq - 合宙文档中心 4G模块接入阿里云-实现数据上传和命令下发_4g模块上传…...
网络安全之vlan实验
在对vlan进行一定的学习之后我们来练习一个小实验来加深理解记忆 首先是对实验进行一个搭建 第一部分:给交换机配置vlan 首先是sw1 [Huawei]vlan batch 2 to 5 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]port hybrid tagged vlan 2 [Huawei-GigabitEthe…...
mac命令行快捷键
光标移动 Ctrl A: 将光标移动到行首。Ctrl E: 将光标移动到行尾。Option 左箭头: 向左移动一个单词。Option 右箭头: 向右移动一个单词。 删除和修改 Ctrl K: 删除从光标到行尾的所有内容。Ctrl U: 删除从光标到行首的所有内容。Ctrl W: 删除光标前的一个单词。Ctrl …...
计算机网络 - OSI 七层模型
OSI 七层模型 OSI(Open System Interconnection,开放系统互联)模型由 ISO(国际标准化组织) 制定,目的是为不同计算机网络系统之间的通信提供一个标准化的框架。它将网络通信划分为 七个层次,每…...
TCP/IP 协议族详细知识点清单
📚 TCP/IP 协议族详细知识点清单 一、概述与体系结构 🌐 TCP/IP 协议模型(四层模型) 层次协议功能应用层HTTP、FTP、DNS、SMTP提供应用服务传输层TCP、UDP端到端传输,可靠或不可靠网络层IP、ICMP、ARP、RARP寻址、路…...
Vue3(自定义指令directive详解)
文章目录 前言一、自定义指令的生命周期钩子二、自定义指令的创建与注册使用三、扩展 简化形式总结 前言 在Vue3中,自定义指令是一种强大的工具,允许开发者扩展和增强HTML元素的功能。以下是对Vue3中自定义指令的详细解析: 一、自定义指令…...
Redis--redis客户端
目录 一、引言 二、数据库管理命令 三、redis客户端 四、Java客户端使用Redis 五、相关命令使用 1.get,set 2.exists,del 3.keys 4.expire,ttl 六、总结 一、引言 在之前学了redis相关类型命令之后,本篇文章,…...
【高项】信息系统项目管理师(十)项目风险管理【5分】
项目风险是一种不确定的事件或条件,一旦发生,会对项目目标产生某种正面或负面的影响。项目风险既包括对项目目标的威胁,也包括促进项目目标的机会。已知风险是那些已经经过识别和分析的风险,对于已知风险,对其进行规划,寻找应对方案是可行的;虽然项目经理们可以依据以往…...
jenkins批量复制视图项目到新的视图
1、当前视图为 测试2分支,创建了新的视图为国际化预生产 2、进入系统设置的脚本管理 import hudson.model.* //源view def str_view "测试2分支" //目标view def str_new_view "国际化预生产" //源job名称(模糊匹配) def str_search &qu…...
uv:Rust 驱动的 Python 包管理新时代
在 Python 包管理工具层出不穷的今天,pip、pip-tools、poetry、conda 等各有千秋。而今天要介绍的 uv,则是一款由 Astral 团队推出、采用 Rust 编写的全新工具,目标直指成为 “Python 的 Cargo”。它不仅在性能上表现优异,而且在功…...
GD32 ISP下载程序(串口烧录)
一、下载烧录软件 下载地址兆易创新GigaDevice-资料下载兆易创新GD32 MCUhttps://www.gd32mcu.com/cn/download?kwGD32All-In-OneProgrammer&lancn 二、使用USB转串口连接GD32开发板 这里使用GD32E230C8T6为例: GD32E230C8T6USB 转串口模块说明PA9ÿ…...
Spring MVC 配置详解与入门案例
目录 引言 一、Spring MVC 的发展背景 1. Model I 与 Model II 2. MVC 模式 二、Spring MVC 入门案例 1. 创建 WEB 工程并引入依赖 2. 配置 web.xml 3. 配置 springmvc.xml 4. 创建控制器和视图 5. 部署并测试 三、Spring MVC 原理 1. 核心组件 2. 请求处理流程 …...
【10万QPS压力测试】Redis三主三从高可用集群基准测试
📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…...
git的进阶使用
一.协作冲突 举个简单的例子,公司里两个人(A,B)同一天上班,都拉取了远程仓库数据。然后A做完了所有的工作,进行了x文件的修改并提交至远程仓库。而B在做自己工作的时候不小心或者需要修改x文件,B认为A没有操作x文件直接push没有问…...
23种设计模式-责任链(Chain of Responsibility)设计模式
责任链设计模式 🚩什么是责任链设计模式?🚩责任链设计模式的特点🚩责任链设计模式的结构🚩责任链设计模式的优缺点🚩责任链设计模式的Java实现🚩代码总结🚩总结 🚩什么是…...
MySQL复习
1基本操作复习 1.1数据库创建 创建数据库create database 数据库名;判断再创建数据库create database if not exists 数据库名;创建数据库指定字符集create database 数据库名 character set 字符集;创建数据库指定排序方式create database 数据库名 collate 排序方式;创建数据…...
【嵌入式学习2】c语言重点整理
目录 ## 重点掌握 1、数组 2、指针 3、结构体 4、函数 回调函数的常见用途 ## 如何区分数组指针,指针数组,函数指针,结构体指针,指针偏移量 ## 重点掌握 1、数组 https://blog.csdn.net/weixin_60546365/article/details…...
java项目之基于ssm的个人博客网站(源码+文档)
项目简介 个人博客网站实现了以下功能: 个人博客网站在Eclipse环境中,使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理员审核博客文章和相册分享信息,管理文…...
C++学习之路:从头搞懂配置VScode开发环境的逻辑与步骤
目录 编辑器与IDE基于vscode的C开发环境配置1. 下载vscode、浅尝编译。番外篇 2. 安装插件,赋能编程。3. 各种json文件的作用。c_cpp_properties.jsontask.jsonlaunch.json 总结&&彩蛋 编辑器与IDE 上一篇博客已经介绍过了C程序的一个编译流程,从…...
deploy myEclipse j2ee project to server没反应
解决办法 1.如果工作空间的问题,那么需要删除你工作空间的一个文件就可以解决了。 这个文件在Myeclipse工作区(workspace) .metadata\.plugins\org.eclipse.core.runtime\.settings目录...
react项目中当组件渲染的时候如何执行接口
最近遇到一个场景,就是组件渲染的时候去调用接口进行数据回填。这个在vue中很简单,在created生命周期函数中,直接调用接口即可。但是react没有created生命周期,所以在react中我们需要用到useEffect钩子函数。 在 React 函数组件中…...
python虚拟环境安装opus(windows)
python -m venv venv 创建虚拟环境后,并且安装软件包后,运行项目报错,提示如下: Could not find Opus library. Make sure it is installed 原因是缺少opus.dll, (先把项目内所有使用的第三方库都安装完成) 从以下页面下载.dll文件之后,放入venv\Scripts目录下即可 https://…...
手机怎么换网络IP有什么用?操作指南与场景应用
在数字化时代,手机已经成为我们日常生活中不可或缺的一部分,无论是工作、学习还是娱乐,手机都扮演着至关重要的角色。而在手机的使用过程中,网络IP地址作为设备在互联网上的唯一标识符,其重要性和作用不容忽视。本文将…...
小程序内表格合并功能实现—行合并
功能介绍:支付宝小程序手写表格实现行内合并,依据动态数据自动计算每次需求合并的值,本次记录行内合并,如果列内合并,同理即可实现 前端技术:grid布局 display:grid 先看实现效果: axml&…...
基于Flask的通用登录注册模块,并代理跳转到目标网址
实现了用户密码的加密,代理跳转到目标网址,不会暴露目标路径,未登录的情况下访问proxy则自动跳转到登录页,使用时需要修改配置项config,登录注册页面背景快速修改,可以实现登录注册模块的快速复用。 1.app…...
nlohmann::json教程
nlohmann::json 核心函数和方法 1. 基础构造与初始化 函数/方法描述示例json j;创建一个空的 JSON 对象(默认是 object 类型)json j;json::object()显式创建一个空的 JSON 对象json j json::object();json::array()显式创建一个空的 JSON 数组json ar…...
多层感知机从0开始实现
《动手学深度学习》-4.2-笔记 多层感知机在输出层和输入层之间增加一个或多个全连接隐藏层,并通过激活函数转换隐藏层的输出。 常用的激活函数包括ReLU函数、sigmoid函数和tanh函数。 import torch from torch import nn from d2l import torch as d2lbatch_size …...
在K8S中使用ArgoCD做持续部署
一、了解argocd ArgoCD是一个基于Kubernetes的GitOps持续交付工具,应用的部署和更新都可以在Git仓库上同步实现,并自带一个可视化界面。本文介绍如何使用GitArgocd方式来实现在k8s中部署和更新应用服务。关于ci这一块这里不多介绍。主要讲解argocd如何实…...
Python中数据结构元组详解
在Python中,元组(Tuple)是一种不可变的序列类型,常用于存储一组有序的数据。与列表(List)不同,元组一旦创建,其内容无法修改。本文将详细介绍元组的基本操作、常见运算、内置函数以及…...
23种设计模式-命令(Command)设计模式
命令设计模式 🚩什么是命令设计模式?🚩命令设计模式的特点🚩命令设计模式的结构🚩命令设计模式的优缺点🚩命令设计模式的Java实现🚩代码总结🚩总结 🚩什么是命令设计模式…...
计算机网络——数据链路层的功能
目录 物理链路 逻辑链路 封装成帧(组帧) 帧定界 透明传输 SDU 差错控制 可靠传输 流量控制 介质访问控制 主机需要实现第一层到第五层的功能,而路由器这种节点只需要实现第一层到第三层的这些功能 假设左边用户需要给右边用户发送…...
Axure项目实战:智慧城市APP(一)首页(动态面板、拖动效果)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:智慧城市APP 主要内容:首页、政务公告、公交查询页面设计 应用场景:各类政务型、B端APP均可参考 案例展示:&am…...
Unity网络开发快速回顾
知识点来源:总结人间自有韬哥在, 唐老狮,豆包 目录 1.网络通信-通信必备知识-IP地址和端口类2.网络通信中序列化和反序列化2进制数据3.Socket类4.TCP同步服务端和客户端基础实现4.1.服务端基本实现4.2.客户端实现: 5.区分消息类型…...
鸿蒙学习笔记(1)-文件解读、编写程序、生命周期
一、文件解读 .hvigor:装有一些编译过程中的依赖缓存。 .idea:工具自动生成的,标记我们的工具是基于idea。 AppScope:代表着整个APP的配置,最后打包使用。之中的resources目录下是应用的名称和图片存放路径,其中app.json5: bund…...
多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题
多维动态规划 不同路径 https://leetcode.cn/problems/unique-paths/ 核心思路 比较简单 f[i][j] f[i - 1][j] f[i][j - 1] ; 示例代码 class Solution {public int uniquePaths(int n, int m) {int[][] f new int[n][m];for (int i 0; i < n; i)f[i][0] 1;for…...
C++ 多线程简要讲解
std::thread是 C11 标准库中用于多线程编程的核心类,提供线程的创建、管理和同步功能。下面我们一一讲解。 一.构造函数 官网的构造函数如下: 1.默认构造函数和线程创建 thread() noexcept; 作用:创建一个 std::thread 对象,但…...
乐仓VUE常用点
页面跳转 发送 router.push({ name: config.editRouteName, query: { type: create, from: route.name as string, }, }); router.push({ name: MbdCalScheme }); 接收 const route useRoute(); const type compu…...
单一主数据系统 vs. 统一主数据中心,哪种更优?
在企业中,主数据管理(MDM)已成为确保数据一致性和高效运营的关键。企业通常使用多个系统来处理业务数据,如ERP、CRM、SRM等。在这种多系统环境下,如何统一管理企业数据、避免数据孤岛,成为了一项重大挑战。…...
数据结构—树(java实现)
目录 一、树的基本概念1.树的术语2.常见的树结构 二、节点的定义三、有关树结构的操作1.按照数组构造平衡 二叉搜索树2.层序遍历树3.前、中、后序遍历树(1).前序遍历树(2).中序遍历树(3).后序遍历树(4).各种遍历的情况的效果对比 4.元素添加5.元素删除1.删除叶子节点2.删除单一…...
Modbus RTU ---> Modbus TCP透传技术实现(Modbus透传、RS485透传、RTU透传)分站代码实现、协议转换器
文章目录 Modbus RTU到Modbus TCP透传技术实现1. 透传技术概述1.1 透传基本原理- 协议帧格式转换- 地址映射与管理- 通信时序适配- 错误检测与处理 2. 透传网关硬件架构2.1 典型硬件结构- 微控制器/处理器(ARM、STM32等)- RS-485/RS-232收发器- 以太网控制器(如W5500)- 电源管理…...
Flask(三)路由与视图函数
在 Flask 中,路由 (Route) 是将 URL 地址映射到特定的视图函数 (View Function) 的机制。视图函数处理用户请求,并返回 HTTP 响应。理解路由和视图函数是构建 Flask 应用的基础。 3.1 路由的基本概念 Flask 使用 app.route() 装饰器来定义路由。以下是…...
mysql 磐维(opengauss)tidb误删数据之高级恢复
Mysql参考: Mysql 8.0 XtraBackupMysqlbinlog 完全恢复 - 墨天轮 Mysql 8.0 XtraBackupMysqlbinlog 完全恢复[TOC]# 一、安装mysql 8.0.19## 1.1https://www.modb.pro/db/509223MySQL 的全量备份、增量备份与 Binlog 时间点恢复_mysqlbinlog自动备份吗-CSDN博客文章…...
常见框架漏洞(一)----Thinkphp(TP)
Thinkphp框架介绍: ThinkPHP是为了简化企业级应⽤开发和敏捷WEB应⽤开发⽽诞⽣的,是⼀个快速、兼容⽽ 且简单的轻量级国产PHP开发框架,诞⽣于2006年初,原名FCS,2007年元旦正式更名为 ThinkPHP,遵循Apache…...
Git 使用指南:从设置用户信息到项目提交的全流程教程(持续更新)
一、设置 Git 用户信息 1.全局设置(适用于所有 Git 仓库): git config --global user.name "Your Name" git config --global user.email youexample.com 2.仅针对当前仓库设置(如果您只想为当前项目设置࿰…...