更多JVM相关知识点详见个人主页【JVM相关】专栏
JVM垃圾回收算法
复制算法
- 将内存分为大小相等的两块。
- 每次只使用其中一块,当这块内存满时,就将存活的对象复制到另一块上。
- 复制完成后,清除原来使用过的内存块。
- 优点:实现简单,垃圾回收时不用考虑内存碎片问题,因为每次都是清空整个半区。快,简单
- 缺点:内存使用率低,只有原来的一半;复制存活对象需要时间,如果存活对象很多,复制成本高。浪费内存
标记清除算法
- 标记:从GC Root开始,标记所有可达的对象。
- 清除:遍历整个内存空间,清除所有未标记的对象。
- 优点:不需要额外的内存空间,适合内存空间较大的情况。不浪费内存
- 缺点:标记和清除过程会产生内存碎片,导致内存空间不连续,可能影响程序性能;标记清除过程需要暂停用户程序,导致用户体验下降。会造成内存碎片
标记整理算法
- 标记:从GC Root开始,标记所有可达的对象。
- 整理:将所有存活的对象向内存的一端移动,然后清除边界外的所有对象。
- 优点:解决了标记清除算法中的内存碎片问题,使内存空间连续。不会有碎片
- 缺点:整理过程需要移动存活对象,成本相对较高;整理过程也需要暂停用户程序。相对较慢
分代收集算法
- 分代收集算法基于这样一个事实:不同的对象的生命周期(存活时间)是不同的。因此,将对象根据其生命周期分为不同的代(Generation)。
- 年轻代(Young Generation):新创建的对象首先被分配到这里,这些对象的生命周期通常较短。
- 老年代(Old Generation):年轻代中存活下来的对象会被移动到这里,这些对象的生命周期较长。
- 持久代(Permanent Generation,Java 8中已被元空间替代):存储类的元数据、字符串常量等。
- 分代收集算法的流程:
- 年轻代通常使用复制算法进行垃圾回收,因为年轻代中的对象大多数生命周期短,存活率低。
- 老年代通常使用标记清除或标记整理算法,因为老年代中的对象生命周期长,存活率高。
- 当老年代的内存不足以容纳存活下来的对象时,会触发全局垃圾回收(Full GC),这时会同时对年轻代和老年代进行垃圾回收。
- 优点:提高了垃圾回收的效率,因为不同代的对象有不同的回收策略。
- 缺点:增加了垃圾回收的复杂性,需要维护多个代的内存空间。
360

被折叠的 条评论
为什么被折叠?



