网站定制电话,简易个人网站模板,聊城制作手机网站公司,医疗网站设计风格目录
引言
GC的作用域
什么是垃圾回收#xff1f;
常见的GC算法
1.引用计数法
2.复制算法
3.标记清除
4.标记整理
小总结
5.分代收集算法
ps:可达性分析算法#xff1f;
可达性分析的作用
可达性分析与垃圾回收算法的关系
结论 引言
在编程世界中#xff0c;…目录
引言
GC的作用域
什么是垃圾回收
常见的GC算法
1.引用计数法
2.复制算法
3.标记清除
4.标记整理
小总结
5.分代收集算法
ps:可达性分析算法
可达性分析的作用
可达性分析与垃圾回收算法的关系
结论 引言
在编程世界中内存管理是一个至关重要的话题。对于使用自动内存管理的语言如Java、Python、Go等垃圾回收Garbage Collection, GC机制是确保程序高效运行的关键。本文将介绍垃圾回收的基本概念并详细讲解四种常见的垃圾回收算法。 GC的作用域 记住GC口诀 分代收集算法
次数频繁Young区次数较少Old区基本不动Perm永久区区 什么是垃圾回收
垃圾回收是一种自动内存管理机制用于识别和释放不再被程序使用的内存。其主要目的是防止内存泄漏减少程序员手动管理内存的负担并提高程序的稳定性和性能。 先看下一个对象的历程 JVM 在进行GC时并非每次都对上面三个内存区域一起回收的大部分时候回收的都是指新生代
因此GC按照回收的区域又分了两种类型一种是普通的GCminor GC一种是全局GC major GC or Full GC
普通GC轻GC只针对新生代区域的GC
全局GC重GC针对老年代的GC偶尔伴随对新生代的GC以及对永久代的GC 常见的GC算法
1.引用计数法 每个对象有一个引用计数器当对象被引用一次则计数器加1当对象引用失效一次则计数器减1对 于计数器为0的对象意味着是垃圾对象可以被GC回收。 2.复制算法
年轻代中使用的是Minor GC采用的就是复制算法 Minor GC 会把Eden中的所有活的对象都移到Survivor区域中如果Survivor区中放不下那么剩下的 活的对象就被移动到Old generation中也就是说一旦收集后Eden就是变成空的了 当对象在Eden包括一个Survivor区域这里假设是From区域出生后在经过一次Minor GC后如 果对象还存活并且能够被另外一块Survivor区域所容纳 上面已经假设为from区域这里应为to区 域即to区域有足够的内存空间来存储Eden 和 From 区域中存活的对象则使用复制算法将这些仍然 还活着的对象复制到另外一块Survivor区域即 to 区域中然后清理所使用过的Eden 以及Survivor 区域即form区域并且将这些对象的年龄设置为1以后对象在Survivor区每熬过一次Minor GC就将这个对象的年龄 1当这个对象的年龄达到某一个值的时候默认是15岁通过 XX:MaxTenuringThreshold 设定参数这些对象就会成为老年代。
-XX:MaxTenuringThreshold 任期门槛设置对象在新生代中存活的次数
面试题如何判断哪个是to区呢一句话谁空谁是to 工作原理 将内存分为两个相等的区域From空间和To空间。 复制阶段从From空间复制所有存活对象到To空间。 清理阶段清空From空间然后交换From和To空间的角色。
优点 简单高效没有内存碎片问题。
缺点 需要双倍内存空间适用于存活对象较少的情况。 3.标记清除
说明老年代一般是由标记清除或者是标记清除与标记整理的混合实现
什么是标记清除 回收时对需要存活的对象进行标记 回收不是绿色的对象 当堆中的有效内存空间被耗尽的时候就会停止整个程序也被称为stop the world然后进行两项 工作第一项则是标记第二项则是清除。
标记从引用根节点开始标记所有被引用的对象标记的过程其实就是遍历所有的GC Roots 然后将所 有GC Roots 可达的对象标记为存活的对象。
清除 遍历整个堆把未标记的对象清除。
缺点这个算法需要暂停整个应用会产生内存碎片。
工作原理 标记阶段从根对象如全局变量、栈中的对象出发遍历所有可达对象并标记它们为存活。 清除阶段遍历整个堆内存释放未被标记的对象所占用的内存。
优点 实现简单适用于大多数场景。
缺点 会产生内存碎片可能导致后续内存分配效率降低。 4.标记整理 在整理压缩阶段不再对标记的对象作回收而是通过所有存活对象都像一端移动然后直接清除边界 以外的内存。可以看到标记的存活对象将会被整理按照内存地址依次排列而未被标记的内存会被 清理掉如此一来当我们需要给新对象分配内存时JVM只需要持有一个内存的起始地址即可这比 维护一个空闲列表显然少了许多开销。
标记、整理算法不仅可以弥补 标记、清除算法当中内存区域分散的缺点也消除了复制算法当中内 存减半的高额代价
工作原理 标记阶段与标记-清除算法相同标记所有存活对象。 整理阶段将所有存活对象移动到内存的一端然后清理边界以外的内存。
优点 解决了内存碎片问题提高了内存利用率。
缺点 整理阶段需要移动对象增加了时间开销。 小总结
内存效率复制算法 标记清除算法 标记整理算法 时间复杂度
内存整齐度复制算法 标记整理算法 标记清除算法
内存利用率标记整理算法 标记清除算法 复制算法
可以看出效率上来说复制算法是当之无愧的老大但是却浪费了太多内存而为了尽量兼顾上面所提到的三个指标标记整理算法相对来说更平滑一些 但是效率上依然不尽如人意它比复制算法多了 一个标记的阶段又比标记清除多了一个整理内存的过程 难道就没有一种最优算法吗猜猜看下面还有
答案 无没有最好的算法只有最合适的算法 。 ----------------- 分代收集算法。 5.分代收集算法
工作原理 基于对象的生命周期将内存分为不同的代如年轻代和老年代。 年轻代使用复制算法因为大多数对象在年轻代中很快死亡。 老年代使用标记-清除或标记-整理算法因为老年代中的对象存活时间较长。
优点 针对不同生命周期的对象采用不同的回收策略提高了回收效率。
缺点 实现复杂需要维护多个代的内存区域。 ps:可达性分析算法
可达性分析算法Reachability Analysis本身并不是一个独立的垃圾回收算法而是一种用于判断对象是否存活的技术。它是许多垃圾回收算法的基础尤其是**标记-清除算法Mark-Sweep和标记-整理算法Mark-Compact**的核心部分。
可达性分析的作用
可达性分析通过从根对象如全局变量、栈中的局部变量、静态变量等出发遍历所有被引用的对象标记这些对象为“存活”。未被标记的对象则被认为是“垃圾”可以被回收。
可达性分析与垃圾回收算法的关系 标记-清除算法Mark-Sweep 使用可达性分析来标记所有存活对象。 在清除阶段释放未被标记的对象的内存。 标记-整理算法Mark-Compact 同样使用可达性分析来标记存活对象。 在整理阶段将存活对象移动到内存的一端然后清理剩余的内存。 分代收集算法Generational 在年轻代和老年代中都可能使用可达性分析来判断对象的存活状态。 年轻代通常使用复制算法而老年代可能使用标记-清除或标记-整理算法。 复制算法Copying 虽然复制算法的主要特点是复制存活对象但它也需要通过可达性分析来确定哪些对象是存活的。 结论
垃圾回收是现代编程语言中不可或缺的一部分它通过自动管理内存极大地简化了程序开发。不同的垃圾回收算法各有优缺点适用于不同的应用场景。理解这些算法的原理和适用场景有助于我们编写更高效、更稳定的程序。