讲师中心 微信公众号
AI工具推荐 视频效率加速

JVM内存回收算法面试题精选:从原理到实现

落辰吖_3326

落辰吖_3326

发布时间:2026-06-25 09:19:33

|

534人浏览过

|

来源于php中文网

原创

JVM内存回收算法的核心是“清什么”和“怎么清得又快又稳”:先通过可达性分析(以GC Roots为起点)判定可回收对象,再依场景选用标记-清除(老年代,有碎片)、标记-整理(老年代,无碎片但开销大)或标记-复制(新生代,无碎片、高效但空间利用率低),并结合分代回收、TLAB等优化机制提升整体效率。

jvm内存回收算法面试题精选:从原理到实现

JVM内存回收算法的核心,不是“怎么清”,而是“清什么”和“怎么清得又快又稳”。面试常考的几类算法,背后都对应着明确的设计取舍:空间换时间、停顿换吞吐、碎片换效率。

怎么判断对象该回收?——可达性分析是唯一答案

引用计数法虽然直观,但因循环引用问题已被JVM彻底弃用。所有现代JVM都依赖可达性分析:从GC Roots出发,沿着引用链向下搜索。不可达的对象才被标记为可回收。

GC Roots主要包括:

  • 虚拟机栈中正在使用的局部变量(如方法参数、栈内对象引用)
  • 方法区中的静态变量(static修饰的类字段)
  • 方法区中的常量(final static引用的对象)
  • 本地方法栈中JNI引用的对象

注意:对象引用设为null只是断开一条路径,是否真正可回收,取决于它是否还被其他Root或存活对象间接引用。

三种基础回收算法各干啥?——匹配不同内存区域

没有万能算法,只有合适场景:

  • 标记-清除(Mark-Sweep):先标记所有存活对象,再统一清除未标记部分。优点是只遍历一次,缺点是产生内存碎片,老年代偶尔使用(如Serial Old)
  • 标记-整理(Mark-Compact):标记后把存活对象向一端压缩,再清理边界外内存。避免碎片,但移动对象带来额外开销,适用于老年代(如CMS的并发整理阶段、G1的混合回收)
  • 标记-复制(Mark-Copy):把存活对象复制到另一块空闲区域,原区域直接清零。无碎片、分配快,但需预留双倍空间——因此专用于新生代(Eden + Survivor区)

为什么分代回收?——利用对象生命周期的天然分布

统计表明,95%以上的新对象朝生暮死。分代回收正是基于这一事实设计:

  • 新生代用复制算法:存活率低,复制成本小;Survivor区两次熬过Minor GC才进入老年代
  • 老年代对象存活率高,复制代价大,改用标记-清除或标记-整理
  • 方法区(元空间)回收极少发生,仅在Full GC时尝试卸载无用类,且必须同时满足三个条件:该类所有实例已回收、Class对象无引用、加载该类的类加载器也无引用

这种划分不是硬编码,而是JVM根据实际对象年龄、晋升阈值、GC日志动态调优的结果。

TLAB与分配优化——回收前的“省力”设计

回收效率不仅靠算法,也靠减少待回收对象数量和降低分配压力:

  • TLAB(Thread Local Allocation Buffer)让每个线程在Eden区拥有私有小块内存,避免多线程竞争指针,提升分配速度
  • 大对象(如长数组)直接分配到老年代,绕过新生代复制,防止频繁触发Minor GC
  • 逃逸分析可能将短生命周期对象栈上分配,根本不上堆,自然无需GC

这些机制不改变回收算法本身,却显著降低了GC频率和单次工作量。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

5656

2023.08.14

讯飞绘文AI写作与文案生成合集
讯飞绘文AI写作与文案生成合集

本专题聚焦讯飞绘文AI写作、提纲生成、文章改写和文案润色,覆盖从主题输入到成稿优化的关键操作与实用技巧。

0

2026.10.14

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

100

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

40

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

20

2026.10.10

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

40

2026.10.10

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

40

2026.10.10

C++构造函数定义与调用方法
C++构造函数定义与调用方法

C++构造函数用于初始化类对象,是面向对象编程的重要基础。本专题从构造函数的定义、声明和调用入手,介绍默认构造函数、带参数构造函数、拷贝构造函数及成员初始化列表,帮助初学者掌握对象创建与初始化的基本方法。

40

2026.10.10

Kratos框架零基础入门教程
Kratos框架零基础入门教程

本专题整理Kratos框架入门内容,涵盖Go环境准备、kratos CLI安装升级、new命令创建项目、目录结构分层说明、服务启动与双协议端口、依赖下载报错排查,帮助开发者快速跑通第一个Kratos框架微服务应用。

40

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SVG 教程
SVG 教程

共20课时 | 20.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn