标签题目
内存管理相关面试题
Linux 的内存布局是什么?
这题考进程虚拟地址空间,回答要按区域、增长方向、权限和虚拟内存映射机制说明。
JVM 堆和栈的原理与区别是什么?
考察 JVM 运行时内存模型,核心是区分堆对象生命周期、线程私有栈帧、引用关系、异常类型和 JIT 优化边界。
C++ 虚函数是什么?
考察 C++ 运行时多态的实现和边界,重点是 virtual、vptr/vtable、动态绑定、虚析构和构造析构阶段规则。
C++ new 操作的原理是什么?
考察 C++ 对象创建和释放的两阶段语义,重点是 operator new 分配原始内存、构造函数初始化、异常回滚和 delete 对称释放。
内存对齐的作用是什么?
考察内存布局和硬件访问效率,重点是对齐规则、padding 来源、结构体大小、缓存友好性和 ABI 兼容风险。
C++ 和 Java 的主要区别是什么?
考察语言对比是否能上升到运行时、内存资源、类型模型、性能控制、工程生态和适用场景,而不是停留在语法差异。
C++ 基类析构函数为什么通常要声明为虚函数?
C++ 基类析构函数通常要声明为虚函数,是为了保证通过基类指针或引用删除派生类对象时,能先调用派生类析构函数,再调用基类析构函数,完整释放派生类资源。否则行为可能未定义,容易造成资源泄漏或清理不完整。
C++ 如何限制类对象只能在堆上或栈上创建?
C++ 限制对象只能在堆上或栈上创建,本质是控制构造、析构和释放入口。只能堆上创建通常把析构函数设为 private 或 protected,并提供 destroy 接口;只能栈上创建通常禁用 operator new 和 operator new[],阻止动态分配。
给定数组指针,如何访问第 50 个元素?
这道题考察的是数组下标、指针运算和数组指针类型的边界理解。核心回答应先澄清“第50位”通常指第50个元素,因此数组从 0 开始计数时应访问 arr[49],若给的是首元素指针则写成 *(p + 49)。如果题目说的是下标 50,则对应 arr[50],也就是第 51 个元素。
指针函数和函数指针的区别?
指针函数和函数指针的核心区别在于“谁是指针”。指针函数本质仍然是函数,只是返回值类型是指针;函数指针本质是指针变量,只是它保存的是某个函数的入口地址。区分它们时,重点看括号优先级、标识符先和谁结合,以及后续是被调用还是被赋值保存函数地址。
内存中的堆和栈有什么区别?
堆和栈的区别?这道腾讯牛客题的关键是围绕“内存堆与栈区别”讲清概念、机制、取舍和边界。内存中的栈主要保存函数调用帧、局部自动变量、返回地址和寄存器保存信息,生命周期随函数调用自动管理;堆用于动态分配对象,生命周期由 malloc/free、new/delete 或运行时 GC 管理。
内存中堆和栈有什么区别?
内存中堆和栈有什么区别?这道腾讯牛客题的关键是围绕“内存堆与栈区别”讲清概念、机制、取舍和边界。内存中的栈主要保存函数调用帧、局部自动变量、返回地址和寄存器保存信息,生命周期随函数调用自动管理;堆用于动态分配对象,生命周期由 malloc/free、new/delete 或运行时 GC 管理。
C和C++有什么区别?
C和C++有什么区别?这道腾讯牛客题的关键是围绕“C 与 C++ 差异”讲清概念、机制、取舍和边界。C 更偏过程式语言,核心是函数、结构体、指针和手动资源管理;C++ 在兼容大量 C 能力的基础上加入类、封装、继承、多态、模板、STL、异常、命名空间和 RAII,支持过程式、面向对象、泛型和资源管理抽象。
java内存泄露怎么排查?
java内存泄露怎么排查?这道腾讯牛客题的关键是围绕“Java 内存泄漏排查”讲清概念、机制、取舍和边界。Java 内存泄漏排查要先确认堆内存是否持续增长、Full GC 后是否无法回落,再用 heap dump 和对象引用链定位被意外持有的对象。重点不是 free 失败,而是对象仍被 GC Roots 间接引用。
JVM 堆内存分配如何保证线程安全?
JVM 堆内存分配如何保证线程安全?这道腾讯牛客题的关键是围绕“JVM 堆对象分配的线程安全”讲清概念、机制、取舍和边界。JVM 堆内存分配保证线程安全,常见方式是优先使用 TLAB 给每个线程分配一小块私有 Eden 区域,线程在自己的 TLAB 里用指针碰撞快速分配;TLAB 不够或不适用时,再走 CAS 加失败重试或加锁的慢路径。
JavaScript 数据类型有哪些?堆和栈在存储上有什么区别?
JavaScript 数据类型有哪些?堆和栈在存储上有什么区别?这道腾讯牛客题的关键是围绕“JavaScript 数据类型与堆栈存储”讲清概念、机制、取舍和边界。JavaScript 数据类型可以先分为原始类型和引用类型。原始类型包括 undefined、null、boolean、number、bigint、string、symbol;对象、数组、函数等属于引用类型。堆和栈的区别要从变量绑定和对象存储解释,而不是简单说某个类型绝对在栈上。
Agent 长期记忆功能如何设计、召回和持续优化?
这题考 Agent 长期记忆的生命周期,不是多用户隔离。答案要覆盖存什么、如何抽取、召回、更新、遗忘、删除、隐私授权和质量评估。
Agent 短期记忆应何时抽取、存放到哪里,并如何拼进 System Prompt?
这题考 Agent 短期记忆的工程链路,回答要区分对话缓冲、摘要、抽取事实和工具状态,并说明抽取时机、存储位置、Prompt 拼装顺序、预算控制和失效规则。
同题还出现在 2 个公司岗位
Agent 记忆出现过期或冲突事实时,如何更新、覆盖和回溯?
这题考 Agent 记忆过期和冲突事实的治理,回答要覆盖事实版本、来源置信度、用户确认、覆盖规则、tombstone、审计回溯和 Prompt 侧只使用当前有效记忆。
同题还出现在 1 个公司岗位
LLM 训练或推理中 FP8 和 BF16 如何按吞吐、显存和稳定性取舍?
这题考 LLM 训练或推理中 FP8 和 BF16 的精度格式取舍,回答重点是显存、带宽、吞吐、数值稳定性和工程校准,不应断言所有 DeepSeek 或 Qwen 版本的内部实现。
LLM 推理算子优化中,Memory Coalescing 和 Bank Conflict 分别是什么,如何影响显存访问效率?
这题考 CUDA 访存优化在 LLM 推理算子里的基本功。回答要把 GMEM 的连续合并访问、SMEM 的 bank 并行访问、warp 级访问模式和 profiling 现象连起来,而不是只背两个定义。
LLM 长上下文推理中,KV Cache 压缩如何降低显存占用,和 Prefix Cache 的作用有什么区别?
这题考长上下文 LLM 推理中的显存管理。回答要把 Prefix Cache 的跨请求前缀复用和 KV Cache 压缩的单次/多次请求显存降载区分开,再说明压缩策略、精度损失、服务集成和评估指标。
接手一个未量化的大模型时,如何推进量化方案选择、校准、精度评估和推理性能迭代?
这题考未量化大模型的量化 rollout 方法论,重点是从部署目标、量化范围、校准集、kernel 支持、质量回归、性能收益到灰度回滚形成闭环,而不是背几个量化名词。
同题还出现在 1 个公司岗位
AWQ 等权重量化引入反量化步骤后,为什么仍可能让 LLM 推理整体变快?
这题考权重量化的反直觉加速机制,核心是解释额外 dequant 计算为什么可能小于权重带宽、显存占用、cache 命中和融合带来的收益,同时说明它只在合适瓶颈和 kernel 支持下成立。
手写 CUDA vector add kernel 时,为什么需要边界判断,为什么通常不用 shared memory,block size 和 warp 有什么关系?
这题考 CUDA 入门 kernel 的工程基本功:线程索引、越界保护、全局内存合并访问、shared memory 是否有复用收益、block size 与 warp/occupancy 的关系。
Agent 上下文压缩应该在什么时候触发,如何在 token 预算、信息损失和任务连续性之间取舍?
这题考上下文压缩的运行时策略:触发点不能只看 token 快满,而要结合任务阶段、信息密度、工具结果、记忆状态、失败风险和可恢复性来决定。
同题还出现在 1 个公司岗位
Agent 使用滑动窗口摘要时,旧摘要应逐步合并还是分段保留,如何控制信息遗失、冲突和可追溯性?
这题考滑动窗口摘要的状态维护策略:合并摘要更省上下文,分段摘要更可追溯,工程上通常需要分层结构而不是二选一。
Agent 如何从对话中更新向量记忆库里的用户画像,避免脏记忆、过期记忆和隐私风险?
这题考 Agent 长期记忆的写入路径:从对话提取用户画像不能直接整段入库,而要做候选抽取、确认、结构化、去重、过期、隐私过滤和可撤回治理。
长上下文推理中 KV Cache 为什么可能被污染,如何做缓存隔离、清理和复用边界控制?
这题考的是大模型推理缓存的正确性与安全边界:KV Cache 本身是某个模型、某段 token、某套位置编码和注意力 mask 下的中间状态;一旦跨请求、跨会话、跨租户、跨模板版本或跨可变上下文错误复用,就可能产生答案串扰、隐私泄漏、事实陈旧或位置错乱。
Qwen 这类大模型训练中,混合精度训练如何实现,为什么能提升吞吐并降低显存?
这题考的是大模型训练数值与系统效率的结合:混合精度不是简单把所有张量改成 FP16,而是在前向、反向、梯度、权重、优化器状态和通信之间选择合适精度来兼顾吞吐、显存和稳定性。
Qwen 支持 128K 长上下文时,如何降低显存占用和注意力计算复杂度?
Qwen 这类支持 128K 长上下文的大模型,不能只靠把最大位置编码拉长来解决问题,核心挑战是注意力计算随序列长度接近平方增长、KV cache 随层数和上下文长度线性增长、训练激活和通信也会放大。常见工程组合包括 RoPE 外推或缩放、FlashAttention 类内存高效注意力、GQA/MQA 降低 KV cache、paged/quantized KV cache、chunked prefill、序列并行或 context parallel、激活重计算,以及在可接受的质量边界内使用滑窗、稀疏或分块注意力。回答时要区分降低显存峰值、降低 KV cache、降低真实计算复杂度三件事。
大模型训练显存如何估算,参数、梯度、优化器状态、激活和临时缓存各占哪些部分?
大模型训练显存可以先拆成 model states、activations、temporary buffers、通信缓存和碎片/框架开销。model states 包括参数、梯度和优化器状态;以 Adam 混合精度训练为例,常见粗估是参数 bf16/fp16 2P、梯度 2P、Adam 一阶和二阶矩 fp32 8P、可选 fp32 master weights 4P,总计约 12P 到 16P bytes。除此之外,activation 随 batch、sequence length、hidden size 和层数增长,长上下文 attention 还可能带来平方项;临时缓存包括 attention workspace、GEMM workspace、logits、通信 bucket、all-gather buffer 和内存碎片。估算时要同时考虑并行策略、ZeRO 分片、activation checkpointing、精度和 micro-batch。
同题还出现在 1 个公司岗位
LLM 推理引擎中 GPU 内存管理机制应如何设计,如何管理 KV Cache、显存碎片、并发 batch 和 OOM 降级?
这题考的是推理引擎的显存资源治理能力:不能只会调用 CUDA malloc,而要能把 KV Cache、临时 workspace、权重、并发请求、碎片控制和 OOM 降级统一成可预测、可观测、可调度的内存系统。
大模型推理时出现 OOM,如何从 batch、输入长度、KV Cache、临时张量峰值和算子实现排查?
这题考推理 OOM 的系统化排障能力:要能把显存占用拆成权重、KV Cache、prefill 临时峰值、decode 并发、算子 workspace 和碎片,并用可复现实验逐步定位,而不是一句降低 batch size。
为什么 CPU 通常需要多级 Cache,而 GPU 更强调 shared memory、coalescing 和高带宽并行访存?
这题考 CPU/GPU 架构差异和访存优化思路。好答案要说明 CPU 面向低延迟、强控制流、少量复杂线程,依赖多级 Cache、分支预测和乱序执行降低单线程访存延迟;GPU 面向高吞吐、大量线程并行,用 warp 调度隐藏延迟,更强调 coalesced global memory access、shared memory 显式复用、高带宽和 occupancy。不能简单说 GPU 没有 Cache,而要说明 GPU 也有 L1/L2/纹理等缓存,只是优化重点从自动低延迟缓存转向显式数据布局和并行带宽利用。
LLM 推理中 KV Cache 大小如何计算,哪些参数决定显存占用?
这题考 LLM 推理显存估算的基础功。高质量回答要给出 KV Cache 公式,说明 batch、上下文长度、层数、KV head 数、head_dim、数据类型、beam/并发和 GQA/MQA 都会影响显存,并区分权重显存、激活显存和 KV Cache 显存。
DeepSpeed ZeRO 中哪些训练状态会占用 GPU 显存,为什么 activation 通常用 checkpoint/recompute 而不是像参数或优化器状态一样分页?
这道题考察大模型训练显存构成和 ZeRO 的边界。回答要先把 GPU 显存里的主要训练状态拆清楚:参数、梯度、优化器状态、激活、通信/临时 buffer 和碎片;再说明 ZeRO 主要分片的是模型状态,Stage 1/2/3 分别处理优化器状态、梯度和参数;最后解释 activation 为什么通常用 checkpoint/recompute:它是 batch/sequence 相关的短生命周期中间结果,反向依赖层级顺序,分页到 CPU/NVMe 会引入高带宽低延迟瓶颈,而重计算能用额外 FLOPs 换显存,通常更可控。