跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
垃圾回收算法
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:垃圾回收算法}} '''垃圾回收算法'''(Garbage Collection Algorithms)是[[Java虚拟机]](JVM)中用于自动管理内存的核心机制,通过识别并回收不再使用的对象来释放内存空间。本条目将详细介绍常见的垃圾回收算法、工作原理及其应用场景。 == 概述 == 在Java等高级语言中,程序员无需手动释放内存,而是由垃圾回收器(Garbage Collector, GC)自动完成。垃圾回收算法的目标是: # 识别哪些对象是“垃圾”(即不再被程序引用)。 # 回收垃圾对象占用的内存。 # 尽量减少程序停顿时间(Stop-The-World)。 == 常见垃圾回收算法 == === 标记-清除算法(Mark-Sweep) === '''标记-清除'''是最基础的垃圾回收算法,分为两个阶段: 1. **标记阶段**:从GC Roots(如静态变量、活动线程栈中的引用)出发,遍历所有可达对象并标记为“存活”。 2. **清除阶段**:遍历堆内存,回收未被标记的对象。 ==== 特点 ==== * 优点:实现简单,不移动对象。 * 缺点:产生内存碎片,可能导致后续分配大对象失败。 ==== 示例 ==== <syntaxhighlight lang="java"> public class MarkSweepExample { public static void main(String[] args) { Object obj1 = new Object(); // 对象A Object obj2 = new Object(); // 对象B obj1 = null; // 对象A变为垃圾 System.gc(); // 触发垃圾回收(不保证立即执行) } } </syntaxhighlight> === 复制算法(Copying) === '''复制算法'''将内存分为两块(From空间和To空间),仅使用其中一块。垃圾回收时,将存活对象复制到另一块空间,并清空原空间。 ==== 特点 ==== * 优点:无内存碎片,分配高效(通过指针碰撞)。 * 缺点:内存利用率仅50%。 ==== Mermaid 图示 ==== <mermaid> flowchart LR A[From空间: 存活对象 + 垃圾] -->|复制存活对象| B[To空间: 仅存活对象] A -->|清空| C[From空间: 空闲] </mermaid> === 标记-整理算法(Mark-Compact) === '''标记-整理'''结合了标记-清除和复制算法的优点: 1. 标记存活对象。 2. 将存活对象向内存一端移动,消除碎片。 ==== 适用场景 ==== 适合老年代(如CMS的最终回收阶段)。 === 分代收集算法(Generational) === 现代JVM普遍采用'''分代收集''',基于对象生命周期将堆划分为: * **新生代**(Young Generation):使用复制算法(如Serial、ParNew)。 * **老年代**(Old Generation):使用标记-清除或标记-整理(如CMS、G1)。 ==== Mermaid 分代模型 ==== <mermaid> pie title 堆内存分代 "新生代 (Eden + Survivor)" : 40 "老年代" : 60 </mermaid> == 实际案例 == === 电商系统内存优化 === 某电商平台在高并发场景下频繁触发Full GC,通过以下步骤优化: 1. 使用`-XX:+UseG1GC`启用G1垃圾回收器。 2. 调整新生代与老年代比例(`-XX:NewRatio=2`)。 3. 监控GC日志(`-Xloggc:/path/to/gc.log`)确认效果。 == 数学基础 == 垃圾回收的停顿时间(Pause Time)可通过以下公式估算: <math> Pause\ Time = \frac{Live\ Data}{Throughput} + Overhead </math> 其中: * *Live Data*:存活对象大小。 * *Throughput*:回收器处理速度。 == 总结 == 垃圾回收算法的选择需权衡吞吐量、停顿时间和内存开销。理解这些算法有助于优化JVM参数并解决内存泄漏问题。 {{Java虚拟机相关}} [[Category:计算机科学]] [[Category:面试技巧]] [[Category:JVM相关]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Java虚拟机相关
(
编辑
)