从JVM底层揭开Java方法重载与重写的面纱:原理、区别与高频面试题突破
🌟引言:一场由方法调用引发的"血案"
2018年,某电商平台在"双十一"大促期间遭遇严重系统故障。
技术团队排查发现,问题根源竟是一个继承体系中的方法重写未被正确处理,导致订单金额计算出现指数级偏差。
这个价值千万的教训揭示了一个真理:深入理解Java方法调用的底层机制,是构建健壮系统的基石。
在Java开发领域,方法重载(Overload)与重写(Override)看似基础,实则暗藏玄机。
据统计,超过60%的Java面试必问这两个概念,但仅有不到30%的开发者能准确阐述其底层实现差异。
本文将带你穿透语法表象,直抵JVM底层设计,通过3D视角(Design, Difference, Detail)全面解析这两个核心机制,并破解10大高频面试题陷阱。
🔧 第一章:方法重载——编译器视角的静态舞蹈
技术概述:名字游戏的多面手
方法重载允许同一类中存在多个同名方法,通过参数列表的差异(类型/数量/顺序)实现功能扩展。这种设计犹如瑞士军刀,通过不同参数组合提供多功能接口。
底层实现原理
-
编译期魔法:重载属于静态分派(Static Dispatch),编译器通过方法名+参数类型生成唯一符号引用。
-
字节码特征:编译后的Class文件中,重载方法通过不同方法描述符(Descriptor)区分。
-
类型匹配优先级:精确匹配 > 自动类型提升 > 装箱拆箱 > 可变参数。
public class DataParser {// 方法签名:parse:(Ljava/lang/String;)Vpublic void parse(String data) { /* XML解析 */ }// 方法签名:parse:(Lorg/json/JSONObject;)Vpublic void parse(JSONObject json) { /* JSON解析 */ }
}
深度解析:编译器如何选择重载方法
当调用parser.parse(input)
时:
-
编译器收集所有候选方法形成重载决议候选集。
-
根据类型匹配度进行排序(基本类型精确匹配优先于包装类)。
-
生成
invokevirtual
或invokestatic
字节码指令。
类型匹配示例:
void process(int num) {} // 优先级1
void process(Integer num) {}// 优先级2
void process(long num) {} // 优先级3
void process(Object num) {} // 优先级4process(10); // 调用int版本
实战陷阱:当重载遭遇继承
class Logger {void log(String message) { /* 记录字符串 */ }
}class NetworkLogger extends Logger {void log(JSONObject json) { /* 记录JSON */ }
}Logger logger = new NetworkLogger();
logger.log("Error"); // 调用Logger的String版本而非子类JSON版本
重载的编译时绑定特性——方法选择仅取决于引用类型,与运行时对象无关。
⚖️ 第二章:方法重写——JVM的动态华尔兹
技术概述:多态的华丽转身
方法重写是子类对父类方法的重新实现,是实现运行时多态(Runtime Polymorphism)的核心机制。
底层实现三要素
-
虚方法表(vtable):每个类维护方法地址表,子类继承父类vtable并覆盖方法指针
-
动态分派机制:通过对象头的类型指针(Klass Pointer)定位实际类型
-
方法访问标志:ACC_PUBLIC、ACC_PROTECTED等修饰符影响方法可见性
class PaymentGateway {public void processPayment(double amount) { /* 默认支付逻辑 */ }
}class AlipayGateway extends PaymentGateway {@Overridepublic void processPayment(double amount) { /* 支付宝特有逻辑 */ }
}
深度解剖:JVM的舞蹈步骤
-
类加载阶段:为每个类创建方法区中的vtable
-
对象实例化:对象头存储指向类元数据的指针
-
方法调用时:
-
通过对象头找到实际类
-
从vtable中获取方法入口地址
-
执行目标方法指令
-
内存布局示例:
性能优化秘籍
-
final方法优化:JIT编译器会去虚化(Devirtualize)final方法,直接调用省去查表开销
-
内联缓存:对高频调用的虚方法,JVM缓存目标方法地址加速访问
-
避免过度重写:层级过深的继承体系会增加vtable查找深度
🌈 第三章:双人舞的差异对比
九维对比表
维度 | 重载 | 重写 |
---|---|---|
作用范围 | 同一类或父子类 | 父子类 |
参数要求 | 必须不同 | 必须相同 |
返回类型 | 可不同 | 协变类型(Java 5+) |
异常处理 | 无限制 | 不能抛出更宽泛异常 |
访问控制 | 任意修饰符 | 不能缩小访问范围 |
绑定时机 | 编译期静态绑定 | 运行期动态绑定 |
多态类型 | 编译时多态 | 运行时多态 |
JVM指令 | invokestatic/invokevirtual | invokevirtual |
设计目的 | 接口灵活性 | 行为多态性 |
内存视角的终极对决
💡 第四章:十大高频面试题深度破解
题目1:为什么不能根据返回类型重载?
陷阱解析:
int calculate() { ... }
double calculate() { ... }double result = calculate(); // 编译器无法确定调用哪个方法:cite[4]:cite[8]
底层原理:
编译器通过方法签名(方法名+参数类型)唯一标识方法,返回类型不参与签名生成。
若允许返回类型重载,会导致调用歧义,破坏类型安全。
题目2:静态方法能被重写吗?
经典误区:
class Parent {static void show() { System.out.println("Parent"); }
}class Child extends Parent {static void show() { System.out.println("Child"); } // 方法隐藏,非重写
}Parent p = new Child();
p.show(); // 输出Parent,证明静态方法不存在多态性
底层原理:
静态方法属于类级别,编译时通过invokestatic
指令绑定,不参与虚方法表(vtable)的动态分派。
题目3:构造方法能重写吗?
真相:
-
构造方法不是继承的,每个类必须显式定义构造方法
-
子类构造器首行必须通过
super()
调用父类构造器(隐式或显式) -
无法通过子类覆盖父类构造方法
题目4:方法重写时访问修饰符有何限制?
规则:
子类方法的访问权限不能比父类更严格。例如:
class Parent {protected void process() { ... }
}class Child extends Parent {@Overridepublic void process() { ... } // 合法(public > protected)// private void process() { ... } 非法(private < protected)
}
题目5:重写方法时异常如何处理?
限制:
子类方法抛出的异常必须与父类相同或是其子类。例如:
class Parent {void validate() throws IOException { ... }
}class Child extends Parent {@Overridevoid validate() throws FileNotFoundException { ... } // FileNotFoundException是IOException子类,合法
}
题目6:可变参数方法能否被重写?
特殊案例:
class Base {void add(int a, int... arr) { ... }
}class Sub extends Base {void add(int a, int[] arr) { ... } // 实际重写了父类方法
}
原理:
Java编译器将可变参数int...
编译为数组int[]
,参数类型相同即构成重写。
题目7:final方法能否被重写?
答案:final
方法禁止重写,但允许重载:
class Parent {final void process() { ... }final void process(int num) { ... } // 合法重载
}class Child extends Parent {// void process() { ... } 编译错误void process(String str) { ... } // 合法重载(参数不同)
}
题目8:重载是否支持父子类参数?
类型匹配优先级:
void process(Object obj) { ... }
void process(String str) { ... }process(new Object()); // 调用Object版本
process("Hello"); // 调用String版本
process((CharSequence)"Hi"); // 调用Object版本(String父接口不构成精确匹配)
机制:
编译器优先选择最具体的参数类型,若父类参数需显式转型才会匹配。
题目9:如何理解多态与重写的关系?
核心机制:
-
多态依赖虚方法表(vtable)实现动态分派
-
对象头中的Klass指针指向实际类的方法表
-
示例:
Animal animal = new Dog();
animal.makeSound(); // 调用Dog类重写方法(vtable查找)
题目10:接口默认方法重写冲突如何解决?
规则:
若实现类继承的多个接口有相同默认方法,必须显式重写:
interface A { default void log() { ... } }
interface B { default void log() { ... } }class C implements A, B {@Overridepublic void log() { // 必须重写A.super.log(); // 显式选择接口实现}
}
🌟 高频考点总结
考察方向 | 核心要点 | 关联题目 |
---|---|---|
语法规则 | 重载参数差异、重写签名一致性、访问修饰符限制 | 1,4,5,7 |
JVM机制 | 静态分派(重载)、动态分派(重写)、虚方法表 | 2,9 |
特殊场景 | 构造方法、final方法、可变参数、接口默认方法 | 3,6,10 |
设计思想 | 多态实现、类型安全、API扩展性 | 8,9 |
每个问题均结合JVM底层机制(如vtable、字节码指令)与典型代码场景解析,建议通过JClassLib工具查看类文件结构,深入理解方法调用逻辑。
🚀 第五章:性能优化实战指南——从原理到工业级调优
🔥 性能瓶颈全景分析
JVM方法调用成本模型(基于HotSpot VM)
调用类型 | 指令周期 | 内存访问次数 | 优化潜力 |
---|---|---|---|
静态方法调用 | 1-3 | 0 | ★☆☆☆☆ |
虚方法调用 | 5-10 | 2-3 | ★★★☆☆ |
接口方法调用 | 10-15 | 3-4 | ★★★★☆ |
反射方法调用 | 50-100 | 5+ | ★★★★★ |
底层原理透视:
虚方法调用需要经过以下步骤:
-
访问对象头中的Klass指针(1次内存读取)
-
定位方法区中的虚方法表(vtable)(1次指针计算)
-
通过偏移量获取方法地址(1次内存读取)
-
跳转到目标方法入口(1次分支预测)
🛠️ 六大核心优化策略
策略1:方法去虚拟化(Devirtualization)
适用场景:高频调用的核心方法
// 优化前
public class PaymentProcessor {public void process(Payment payment) {payment.execute(); // 虚方法调用}
}// 优化后:JIT编译器自动去虚拟化条件
public class PaymentProcessor {public void process(Payment payment) {if (payment.getClass() == Alipay.class) {((Alipay)payment).execute(); // 直接调用} else {payment.execute();}}
}
触发条件:
-
方法调用点的接收者类型可确定(单态/双态)
-
使用
-XX:CompileCommand=inline
强制内联
策略2:虚方法表压缩
优化原理:减少vtable层级深度
// 反例:过深的继承体系
class A { void foo() {} }
class B extends A { void foo() {} }
class C extends B { void foo() {} } // vtable层级深度=3// 正例:扁平化设计
interface Processor { void process(); }
class FastProcessor implements Processor { ... } // 直接实现接口
效果对比:
-
3层继承:vtable查找需要3次指针跳转
-
接口实现:通过itable(接口方法表)直接索引
策略3:关键路径方法内联
JVM参数调优:
-XX:MaxInlineSize=35 # 最大内联字节码大小
-XX:FreqInlineSize=325 # 高频方法内联阈值
-XX:InlineSmallCode=2000 # 编译器生成代码大小限制
策略4:空对象模式(Null Object)
经典案例优化:
// 优化前:每次调用都要判空
public class Logger {public void log(String message) {if (writer != null) {writer.write(message);}}
}// 优化后:消除条件分支
class NullWriter extends Writer {public void write(String msg) { /* 空实现 */ }
}Logger logger = new Logger(new NullWriter()); // 依赖注入
logger.log("test"); // 无需判空直接调用
性能收益:
-
消除分支预测错误惩罚(~5-10 cycles)
-
提升指令缓存局部性
策略5:选择性final修饰
最佳实践:
public class Vector3D {// 坐标计算核心方法public final double dotProduct(Vector3D other) {return x*other.x + y*other.y + z*other.z;}
}
JVM层收益:
-
禁止子类重写,确保方法稳定性
-
触发去虚拟化优化
-
允许JIT激进内联
策略6:方法句柄替代反射
性能对比测试:
// 反射调用(传统方式)
Method method = clazz.getMethod("calculate");
method.invoke(obj); // 耗时约 120ns// 方法句柄优化
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh = lookup.findVirtual(clazz, "calculate", MethodType.methodType(void.class));
mh.invokeExact(obj); // 耗时约 25ns
底层机制:
方法句柄在第一次调用时生成字节码桩(stub),后续调用直接跳转,避免反射的权限检查开销。
🧪 性能调优实验:电商系统支付接口优化
原始代码(存在严重虚方法调用)
public interface Payment {void pay(BigDecimal amount);
}class Alipay implements Payment { ... }
class WechatPay implements Payment { ... }// 支付网关
public class PaymentGateway {public void process(List<Payment> payments) {payments.forEach(p -> p.pay(amount)); // 虚方法调用热点}
}
优化步骤:
-
JProfiler分析:发现虚方法调用占CPU 35%
-
逃逸分析:确认Payment实现类不超过3种
-
去虚拟化改造:
public void process(List<Payment> payments) {payments.forEach(p -> {if (p instanceof Alipay) {((Alipay)p).fastPay(amount); // 特殊优化路径} else {p.pay(amount);}});
}
优化结果:
指标 | 优化前 | 优化后 | 提升 |
---|---|---|---|
QPS | 12,345 | 18,920 | +53% |
平均延迟 | 45ms | 29ms | -35.6% |
CPU使用率 | 78% | 62% | -20.5% |
🔧 调优工具箱推荐
-
诊断工具:
-
JITWatch(可视化JIT编译过程)
-
async-profiler(无采样偏差的性能分析)
-
-
JVM参数:
-XX:+PrintCompilation # 打印JIT编译日志 -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation -XX:LogFile=hotspot.log
-
代码检测:
// 方法调用次数统计 public class MethodCounter {private static final LongAdder counter = new LongAdder();public void monitoredMethod() {counter.increment();// 业务逻辑...} }
🌟 性能优化黄金法则
-
测量优先:永远基于profiler数据而非直觉优化
-
二八定律:集中优化20%的热点代码
-
分层优化:架构设计 → 算法优化 → 代码调优 → JVM参数
-
回归验证:每次只做一个优化并验证效果
-
安全边际:保留20%的性能余量应对流量波动
通过将方法重载/重写的底层原理与性能优化结合,开发者可在高并发场景下实现数量级的性能提升。
建议结合《Java性能权威指南》第6章方法与线程优化,深入理解JVM的运行时优化机制。
🌟 结语:通往Java大师的必经之路
理解方法重载与重写的底层实现,犹如获得打开Java世界大门的金钥匙。
这种认知不仅能帮助你在面试中游刃有余,更能让你在如下场景大显身手:
-
框架设计:合理规划API接口的扩展性
-
性能调优:在热点代码中使用final方法提升性能
-
故障排查:快速定位由多态引发的方法调用异常
-
代码审查:识别违反里氏替换原则的重写实现
推荐进阶路径:
-
研读《深入理解Java虚拟机》第8章方法调用
-
分析Spring框架中BeanFactory与ApplicationContext的方法重写设计
-
使用JClassLib工具查看Class文件的vtable结构
最后,以Java之父James Gosling的名言共勉:"Java的优雅在于其简单性,但简单背后需要深刻的理解。"
让我们在技术的深海中继续探索,用知识武装自己,编写出更优雅、更高效的代码!
相关文章:
从JVM底层揭开Java方法重载与重写的面纱:原理、区别与高频面试题突破
🌟引言:一场由方法调用引发的"血案" 2018年,某电商平台在"双十一"大促期间遭遇严重系统故障。 技术团队排查发现,问题根源竟是一个继承体系中的方法重写未被正确处理,导致订单金额计算出现指数级…...
线程控制与线程操作
目录 线程的创建 tid pthread_self() 线程的退出 pthread_join 传参问题和返回值问题 pthread_exit 线程取消 线程分离 我们来学习线程的控制与线程操作 线程的创建 我们之前在线程的概念中就讲过了,我们可以通过pthread_create来创建一个或者多个子线程…...
Spring相关API
1是相对路径 2 是绝对路径 3 在注解时使用...
【GoLang】调用llm时提示词prompt的介绍以及使用方式
介绍 提示词是一种与大模型交互的对话格式,它以 JSON 格式定义了一个消息列表(messages),包含了系统消息和用户消息。 我们向AI提问时,其实发给AI的都是提示词,别看我们只是简单输入了一句话,…...
[杂学笔记]锁为什么影响效率、I/O多路复用、三种I/O多路复用模型的区别、atomic原子操作类、MySQL的持久性是如何实现的
目录 1.锁为什么影响效率 2.I./O多路复用 3.三种I/O多路复用模型的区别 4.atomic原子操作类 介绍 常用函数 内存顺序含义 5.MySQL持久性的实现 1.锁为什么影响效率 线程阻塞与上下文切换:在多线程并发访问的场景下,只有一个线程能够进入临界区…...
AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤
前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…...
Leetcode 刷题笔记 图论part05
卡码网 107 寻找存在的路径 初识并查集 并查集功能: 寻找根节点,函数: find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数: join(int u, int v),将两个节点连在同一个根节点上判断两…...
NSSRound(持续更新)
了解过PHP特性吗 这个题相当于是php特性大杂烩 先看源代码 <?php error_reporting(0); highlight_file(__FILE__); include("rce.php"); $checker_1 FALSE; $checker_2 FALSE; $checker_3 FALSE; $checker_4 FALSE; $num $_GET[num]; if (preg_match(&qu…...
Python虚拟环境:从入门到实战指南
目录 一、为什么需要Python虚拟环境? 二、如何创建Python虚拟环境? 1. 使用venv(Python 3.3内置) 2. 使用virtualenv(第三方工具) 3. 使用conda(适合数据科学项目) 三、虚拟环…...
Python实现小红书app版爬虫
简介:由于数据需求的日益增大,小红书网页版已经不能满足我们日常工作的需求,为此,小编特地开发了小红书手机版算法,方便大家获取更多的数据,提升工作效率。 手机版接口主要包括:搜素࿰…...
注册中心之Nacos相较Eureka的提升分析
1. 传统拉取模式的缺陷(如Eureka) 在类似Eureka的注册中心中,消费者需要定时(如每30秒)主动拉取服务列表(Pull模式)。如果此时某个服务突然宕机,消费者可能无法立即感知,…...
高数下---8.1平面与直线
目录 平面的确定 直线的确定 若要求某一直线或平面就根据要素来求。 例题 平面中的特殊情况 平面中的解题思路 直线的解题思路 平面的确定 两要素 一 一点 二 倾斜角 即法向量 点法式 可化为一般式 Ax By Cz D 0; (A,B,C) 即法向量; 改变D 即…...
【AI速读】30分钟搭建持续集成:用Jenkins拯救你的项目
每个开发者都踩过的坑 你有没有这样的经历?花了一周时间改代码,自信满满准备提交,结果合并同事的更新后,项目突然编译失败,测试跑不通。你焦头烂额地排查问题,老板还在催进度……但明明不是你的错! 这种“集成地狱”几乎每个团队都遇到过。传统的手动集成方式(比如每周…...
centos 9 编译安装 rtpengine (快方式)-使用 debian12 系统自带
1:更新系统包 dnf update 2:启用EPEL仓库(提供额外软件包) # 安装EPEL仓库 sudo dnf install epel-release -y# 检查EPEL仓库是否启用(输出应包含epel) dnf repolist# 启用CRB仓库 sudo dnf config-manager --set-e…...
Android第六次面试总结(okhttp篇)
OkHttp 是一个高效的 HTTP 客户端,它的工作流程包含多个步骤,从请求的创建、发送,到服务器响应的接收和处理,每个环节都有特定的逻辑和组件参与。以下是对 OkHttp 工作流程的详细说明: 1. 请求构建 在使用 OkHttp 发…...
ngx_http_escape_location_name
定义在 src\http\ngx_http.c static ngx_int_t ngx_http_escape_location_name(ngx_conf_t *cf, ngx_http_core_loc_conf_t *clcf) {u_char *p;size_t len;uintptr_t escape;escape 2 * ngx_escape_uri(NULL, clcf->name.data, clcf->name.len,NGX_ESCAPE_U…...
QT网络通信的接口与使用
文章目录 前言1.服务端实现流程1.1步骤 1:创建 QTcpServer 并监听端口1.2步骤 2:处理新连接请求1.3步骤 3:接收客户端数据1.4步骤 4:处理客户端断开 2.客户端实现流程2.1步骤 1:创建 QTcpSocket 并连接服务器2.2步骤 2…...
基于生成对抗网络(GAN)的图像超分辨率重建:技术与应用
图像超分辨率重建(Super-Resolution, SR)是计算机视觉领域的重要任务,旨在从低分辨率图像中恢复出高分辨率图像。这一技术在医学影像、卫星图像、视频增强等领域具有广泛的应用价值。传统的超分辨率方法依赖于插值或基于模型的重建,效果有限。近年来,生成对抗网络(GAN)通…...
【spring对bean Request和Session的管理流程】
在 Spring 框架中,除了常见的 单例(Singleton) 和 原型(Prototype) 作用域外,还支持 Request 和 Session 作用域。这两种作用域主要用于 Web 应用程序中,分别表示 Bean 的生命周期与 HTTP 请求或…...
FastGPT原理分析-数据集创建第二步:处理任务的执行
概述 文章《FastGPT原理分析-数据集创建第一步》已经分析了数据集创建的第一步:文件上传和预处理的实现逻辑。本文介绍文件上传后,数据处理任务的具体实现逻辑。 数据集创建总体实现步骤 从上文可知数据集创建总体上来说分为两大步骤: &a…...
AI重构SEO关键词优化路径
内容概要 人工智能技术的深度应用正在推动SEO优化进入全新阶段。传统关键词优化依赖人工经验与静态规则,存在效率瓶颈与策略滞后性缺陷。AI技术通过智能语义分析系统,能够穿透表层词汇限制,精准捕捉用户搜索意图的语义关联网络,结…...
VMWare Ubuntu 详细安装教程
VMWare Ubuntu 详细安装教程 一、下载安装VMware二、下载 Ubuntu 镜像文件三、安装 Ubuntu四、开启虚拟机 一、下载安装VMware 官网下载地址https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion知乎大佬的博客原文,含下载地址https://zhua…...
SystemVerilog 数据类型
1、内建数据类型 verilog有两种基本的数据类型:变量和线网,他们各自都可以有四种取值:0 1 z x; RTL代码使用 变量 来存放组合和时序值;变量可以是单bit或者是多bit的无符号数 reg [7:0] m, 32bit的有符号…...
C语言:扫雷
在编程的世界里,扫雷游戏是一个经典的实践项目。它不仅能帮助我们巩固编程知识,还能锻炼逻辑思维和解决问题的能力。今天,就让我们一起用 C 语言来实现这个有趣的游戏,并且通过图文并茂的方式,让每一步都清晰易懂 1. 游…...
特殊行车记录仪DAT视频丢失的恢复方法
行车记录仪是一种常见的车载记录仪,和常见的“小巧玲珑”的行车记录仪不同,一些特种车辆使用的记录仪的外观可以用“笨重”来形容。下边我们来看看特种车载行车记录仪删除文件后的恢复方法。 故障存储: 120GB存储设备/文件系统:exFAT /簇大小:128KB 故…...
_DISPATCHER_HEADER结构中的WaitListHead和_KWAIT_BLOCK的关系
第一部分: // // Wait block // // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; struct _KTHREAD *RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK *R…...
智能汽车图像及视频处理方案,支持视频实时拍摄特效能力
在智能汽车日新月异的今天,美摄科技作为智能汽车图像及视频处理领域的先行者,凭借其卓越的技术实力和前瞻性的设计理念,为全球智能汽车制造商带来了一场视觉盛宴的革新。美摄科技推出智能汽车图像及视频处理方案,一个集高效性、智…...
Rust + 时序数据库 TDengine:打造高性能时序数据处理利器
引言:为什么选择 TDengine 与 Rust? TDengine 是一款专为物联网、车联网、工业互联网等时序数据场景优化设计的开源时序数据库,支持高并发写入、高效查询及流式计算,通过“一个数据采集点一张表”与“超级表”的概念显著提升性能…...
Android Audio基础(13)——audiomixer
在 Android 平台上,音频混合器 AudioMixer 主要用在 AudioFlinger 里,将多路音频源数据混音(包括混音、音量处理、重采样及处理声道等)。位于 framework 的音频处理模库 libaudioprocessing(frameworks/av/media/libau…...
vivo 湖仓架构的性能提升之旅
作者:郭小龙 vivo互联网 大数据高级研发工程师 导读:本文整理自 vivo互联网 大数据高级研发工程师 郭小龙 在 StarRocks 年度峰会上的分享,聚焦 vivo 大数据多维分析面临的挑战、StarRocks 落地方案及应用收益。 在 即席分析 场景,…...
常见中间件漏洞攻略-Tomcat篇
一、 CVE-2017-12615-Tomcat put方法任意文件写入漏洞 第一步:开启靶场 第二步:在首页抓取数据包,并发送到重放器 第三步:先上传尝试一个1.txt进行测试 第四步:上传后门程序 第五步:使用哥斯拉连接 二、后…...
基于linuxC结合epoll + TCP 服务器客户端 + 数据库实现一个注册登录功能
1. 整体功能概述 实现了一个简单的用户注册和登录系统,采用客户端 - 服务器(C/S)架构。 客户端可以选择注册或登录操作,将用户名和密码发送给服务器,服务器接收请求后处理并返回相应的结果给客户端。 服务器使用 SQLit…...
redis7.4.2单机配置
解压源码包 将从官网下载的redis源码压缩包上传到服务器的相关目录下。 [roothcss-ecs-2851 ~]# cd /opt/soft/redis/ [roothcss-ecs-2851 redis]# ls redis-stable.tar.gz解压并进入解压后的目录中。 [roothcss-ecs-2851 redis]# tar -zxvf redis-stable.tar.gz [roothcss-…...
Unity代码热更新和资源热更新
知识点来源:人间自有韬哥在,hybridclr,豆包 目录 一、代码热更新1.代码热更新概述2.HybridCLR 二、资源热更新1.资源热更新概述2.AB包2.1.AB包的加载2.2.卸载AB包2.3.加载AB包依赖包2.4.获取MD52.5.生成对比文件2.6.更新AB包 3.Addressable3.1.AssetRef…...
【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法
💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…...
腾讯四面面经
说明 是的,没听错,确实是腾讯四面,而且是技术面。先声明下,这个面经是帮朋友整理的,都是真实的面经,不得不说,四面确实是有强的的,接下来让我们一起看下 面试部门:s3&a…...
【mysql】唯一性约束unique
文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯…...
如何理解前端工程化
前端工程化详解 一、 定义二、特点1. 模块化2. 组件化3. 自动化4. 规范化 三、涉及环节1. 项目架构2. 版本控制:3.自动化构建4.任务自动化5. 部署与CI/CD 五、 前端工程化的实际应用六、前端工程化的优势:七、总结 一、 定义 前端工程化是指将前端开发…...
嵌入式八股RTOS与Linux---进程间的通信与同步篇
前言 同步异步、阻塞/非阻塞是什么? 同步:在执行某个操作时,调用者必须等待该操作完成并返回结果后,才能继续执行后续的操作异步:在执行某个操作时,调用者发起操作后不必等待其完成,可以立即继续执行后续的操作。操作完成后&am…...
this.centerDialogVisible = true this.$nextTick(()=>{ this.resetForm(); })
这段代码的作用是 打开一个对话框,并在对话框打开后 重置表单。下面是对这段代码的详细解析: 1. 代码作用 this.centerDialogVisible true:控制对话框的显示。this.$nextTick(() > { ... }):在 DOM 更新后执行回调函数&#…...
datawhale组队学习--大语言模型—task4:Transformer架构及详细配置
第五章 模型架构 在前述章节中已经对预训练数据的准备流程(第 4 章)进行了介绍。本章主 要讨论大语言模型的模型架构选择,主要围绕 Transformer 模型(第 5.1 节)、详细 配置(第 5.2 节)、主流架…...
专业级 AI 提示生成工具清单
1. 引言 近年来,随着 GPT-3、GPT-4 等大规模预训练语言模型的广泛应用,提示(Prompt)工程作为驱动模型输出质量的重要环节,受到了各界的高度关注。精心设计、管理与优化提示,不仅能够大幅提高生成文本的准确…...
Web前端考核 JavaScript知识点详解
一、JavaScript 基础语法 1.1 变量声明 关键字作用域提升重复声明暂时性死区var函数级✅✅❌let块级❌❌✅const块级❌❌✅ 1.1.1变量提升的例子 在 JavaScript 中,var 声明的变量会存在变量提升的现象,而 let 和 const 则不会。变量提升是指变量的声…...
23种设计模式-生成器(Builder)设计模式
工厂方法设计模式 🚩什么是生成器设计模式?🚩生成器设计模式的特点🚩生成器设计模式的结构🚩生成器设计模式的优缺点🚩生成器设计模式的Java实现🚩代码总结🚩总结 🚩什么…...
Thinkphp(TP)框架漏洞攻略
1.环境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.访问靶场 远程命令执行: ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 远程代码执行: ? s/Index/\think\app/invokefunc…...
HTTP/HTTPS 中 GET 请求和 POST 请求的区别与联系
一、基础概念 HTTP (HyperText Transfer Protocol, 超文本传输协议) 是一种用于浏览器与服务器之间进行数据交互的协议。HTTPS (加密的 HTTP) 则通过 SSL/TLS 协议实现通信加密与数据安全性。 二、GET 和 POST 概述 GET 请求: 用于从服务器获取资源。 POST 请求: 用于将数据…...
2021年蓝桥杯第十二届CC++大学B组真题及代码
目录 1A:空间(填空5分_单位转换) 2B:卡片(填空5分_模拟) 3C:直线(填空10分_数学排序) 4D:货物摆放(填空10分_质因数) 5E…...
解锁 AWX+Ansible 自动化运维新体验:快速部署实战
Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具,而 AWX 则是 Ansible 的开源 Web 管理平台,提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX,使用 M…...
简洁、实用、无插件和更安全为特点的WordPress主题
简站WordPress主题是一款以简洁、实用、无插件和更安全为特点的WordPress主题,自2013年创立以来,凭借其设计理念和功能优势,深受用户喜爱。以下是对简站WordPress主题的详细介绍: 1. 设计理念 简站WordPress主题的核心理念是“崇…...
区块链学习总结
Hardhat 是一个用于 Ethereum 智能合约开发 的开发环境,专为 Solidity 语言编写的智能合约提供工具支持。它能够帮助开发者 编译、部署、测试和调试 智能合约,并提供一个本地的以太坊测试网络。 Hardhat 的核心功能 本地开发网络(Hardhat Ne…...