从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年,某电商平台在"双十一"大促期间遭遇严重系统故障。 技术团队排查发现,问题根源竟是一个继承体系中的方法重写未被正确处理,导致订单金额计算出现指数级…...
Driver具体负责什么工作
在 Apache Spark 中,Driver(驱动程序) 是 Spark 应用的核心控制节点,负责协调整个应用的执行流程。它是用户编写的 Spark 应用程序(如 main() 方法)的入口点,直接决定了任务的调度、资源分配和结…...
python3使用lxml解析xml时踩坑记录
文章目录 你的 XML 数据解析 XML----------------------------1. 获取 mlt 根元素的属性--------------------------------------------------------2. 获取 chain 元素的属性--------------------------------------------------------3. 获取所有 property 的值-------------…...
MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE和 EXPLAIN性能分析和优化
在 MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE 和 EXPLAIN 是性能分析和优化的核心工具。以下是它们的详细用法和高级语法: 一、查看 SQL 执行频次 通过 SHOW STATUS 命令可以查看 SQL 的执行频次,帮助定位高频查询。 1. 查看全局 SQL 执行频次 SHOW GLOBAL STATU…...
芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门
1. 概述 RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销…...
【Go】切片
知识点关键概念切片声明var slice []int初始化切片slice : []int{1,2,3}make() 创建切片make([]int, len, cap)获取长度和容量len(slice), cap(slice)追加元素slice append(slice, value)切片截取slice[start:end](返回子切片)拷贝切片copy(dest, src)&…...
html css js网页制作成品——HTML+CSS+js迪奥口红网站网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
PPT 转高精度图片 API 接口
PPT 转高精度图片 API 接口 文件处理 / 图片处理,将 PPT 文件转换为图片序列。 1. 产品功能 支持将 PPT 文件转换为高质量图片序列;支持 .ppt 和 .pptx 格式;保持原始 PPT 的布局和样式;转换后的图片支持永久访问;全…...
python学习笔记--实现简单的爬虫(二)
任务:爬取B站上最爱欢迎的编程课程 网址:编程-哔哩哔哩_bilibili 打开网页的代码模块,如下图: 标题均位于class_"bili-video-card__info--tit"的h3标签中,下面通过代码来实现,需要说明的是URL中…...
【颠覆性缓存架构】Caffeine双引擎缓存实战:CPU和内存双优化,命中率提升到92%,内存减少75%
千万级QPS验证!Caffeine智能双缓存实现 92%命中率,内存减少75% 摘要: 本文揭秘千万级流量场景下的缓存革命性方案!基于Caffeine打造智能双模式缓存系统,通过冷热数据分离存储与精准资源分配策略,实现CPU利…...
STM32八股【2】-----ARM架构
1、架构包含哪几部分内容 寄存器处理模式流水线MMU指令集中断FPU总线架构 2、以STM32为例进行介绍 2.1 寄存器 寄存器名称作用R0-R3通用寄存器用于数据传递、计算及函数参数传递;R0 也用于存储函数返回值。R4-R12通用寄存器用于存储局部变量,减少频繁…...
智能汽车图像及视频处理方案,支持视频智能包装能力
美摄科技的智能汽车图像及视频处理方案,通过深度学习算法与先进的色彩管理技术,能够自动调整图像中的亮度、对比度、饱和度等关键参数,确保在各种光线条件下,图像都能呈现出最接近人眼的自然色彩与细节层次。这不仅提升了驾驶者的…...
<C#> 详细介绍.net 三种依赖注入:AddTransient、AddScoped、AddSingleton 的区别
在 .NET 8 里,AddTransient、AddScoped 和 AddSingleton 均为依赖注入容器用于注册服务的方法,不过它们的生命周期管理方式存在差异。下面为你详细介绍这三种方法的区别。 1. AddTransient AddTransient 方法所注册的服务,每次被请求时都会…...
jenkins+1panel面板java运行环境自动化部署java项目
本文章不包含1panel面板安装、jenkins部署、jenkins连接git服务器等操作教程,如有需要可以抽空后期补上 jenkins安装插件Publish Over SSH 在系统配置添加服务器 查看项目的工作空间 项目Configure->构Post Steps选择Send files or execute commands over SSH…...
C语言 【实现电脑关机小游戏】非常好玩
引言 在时间限制内做出正确的回答,时间一到,电脑自动关机,听起来是不是很有意思,下面来看看怎么实现吧。 注意:该游戏只在windows系统下可以玩, 一、游戏原理: 在Windows系统下,通…...
备份比赛数据【算法赛】
0备份比赛数据【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛的组委会最近遇到了一个棘手的问题。他们有 N 台电脑需要备份比赛数据,每台电脑所需的备份时间分别为 A1,A2,…,AN 分钟。 备份必须按编号顺序依次进行,即先第 1 台,再第 2 …...
[网络安全] 滥用Azure内置Contributor角色横向移动至Azure VM
本文来源于团队的超辉老师,其系统分析了Azure RBAC角色模型及其在权限滥用场景下的攻击路径。通过利用AADInternals工具提升用户至Contributor角色,攻击者可在Azure VM中远程执行命令,创建后门账户,实现横向移动。文中详述了攻击步…...
人工智能(AI)系统化学习路线
一、为什么需要系统化学习AI? 人工智能技术正在重塑各行各业,但许多初学者容易陷入误区: ❌ 盲目跟风:直接学习TensorFlow/PyTorch,忽视数学与算法基础。 ❌ 纸上谈兵:只看理论不写代码,无法解…...
Ubuntu系统使用nmcli配置静态IP
1. 配置静态IP 以下命令请全部加上sudo, 否则很可能会报错!!! 列出可用的网络连接 nmcli connection show找到你的 WiFi 连接名称(如 "WiFi名称")。 设置静态 IP 地址、网关和 DNS nmcli connection modif…...
vue3,element-plus 表格单选、多选、反选、全选
准备 定义数据 // 表格 const table ref(); // 表格数据 import type { User } from "/interface"; const tableData ref<User[]>([]); // 表格选集 const tableSelection ref<User[]>([]); // 表格选择行 const tableSelectedRow ref<User>…...
ngx_http_core_server_name
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_srv_conf_t *cscf conf;u_char ch;ngx_str_t *value;ngx_uint_t i;ngx_…...
如何提升库存系统的高并发和稳定性:算法与设计模式
库存系统是企业运营的核心模块,尤其是在电商、零售和供应链管理中,系统的高并发和稳定性直接影响订单处理的准确性和效率。面对海量订单、复杂的库存管理需求,如何在高并发环境下确保库存数据的准确性和系统的稳定性?本文将从架构…...
【Linux】从开发到系统管理深入理解环境变量
文章目录 前言一、环境变量概念1.1 为什么需要环境变量?1.2 环境变量的本质特征 二、环境变量PATH2.1 PATH的运作机制2.2 常见环境变量及其作用2.3 环境变量操作指南 三、再谈环境变量3.1main函数命令行参数解析3.2 环境变量的继承机制3.3 本地变量与内部构建命令 总…...
C++相关
1.定义pos时最好用无符号整型 如uint8_t size_t 编译器可能会有(有符号/无符号不匹配)的警告 总的来说就是符号一致 2.遇到俩个lambda相互调用的情况 使用std:funtion前置声明 3.回顾了虚函数,定义virtual 就是虚函数 一般是父类指针指向子…...
智算中心系统化建设与运营框架
智算中心系统化建设与运营框架 围绕智算中心全生命周期,从政策驱动到技术落地构建完整解决方案: 一、政策与产业生态 政策支撑体系 算力补贴机制: 国家层面:工信部“东数西算”工程对西部智算中心给予电价优惠(0.3元/…...
空气质量查询API:助力健康生活与环境监测的智能工具
引言 随着工业化和城市化的快速发展,空气质量问题日益受到人们的关注。空气质量不仅影响我们的日常生活,还直接关系到我们的健康。因此,了解空气质量指数(AQI)以及各项污染物的浓度,对于保障人们的健康至关…...
【CGE】社会核算矩阵构建(一):SAM基本结构
【CGE】社会核算矩阵构建(一):SAM基本结构 社会核算矩阵构建(一):SAM基本结构一、SAM的概念和基本特点二、SAM的基本结构1.开放经济体的SAM表结构2.SAM表各账户的主要核算内容(1)社会…...
Ubuntu 系统部署 Ollama + DeepSeek + Docker + Ragflow
🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 Mysql数据库规范 一、Ol…...
深入探究 JVM 堆的垃圾回收机制(二)— 回收
GC Roots 枚举需要遍历整个应用程序的上下文,而在进行可达性分析或者垃圾回收时,如果我们还是进行全堆扫描及收集,那么会非常耗时。JVM 将堆分为新生代及老生代,它们的回收频率及算法不一样。 1 回收算法 在进行可达性分析时&am…...
第三讲 | C/C++内存管理完全手册
C/C内存管理 一、 C/C内存分布二、 C语言中动态内存管理方式:malloc/calloc/realloc/free三、 C内存管理方式1. new/delete操作内置类型2. new和delete操作自定义类型 四、operator new和operator delete函数(重点)五、new和delete的实现原理…...
