后端开发进阶之路程序员

JVM 常用垃圾回收算法

2017-07-09  本文已影响59人  程序之心

Java 虚拟机提供了垃圾回收功能,把程序员从内存管理的工作中解放出来,一定程度上提高了程序开发效率,降低了内存溢出发生的概率。垃圾回收涉及到很多算法的细节,并且不同的虚拟机实现会有细节上的差异,本文仅整理描述几种常用算法的思想。

标记-清除算法

标记-清除算法分为两个阶段:标记、清除。在标记阶段,扫描并标记所有需要回收的对象;在清除阶段,统一回收被标记的对象。这个算法的效率并不高,并且清除对象后会产生大量不连续的内存碎片。

复制算法

复制算法把内存分为两部分,两部分大小相同,每次只使用其中一个。一块内存用完后,把活着的对象复制到另一块内存,当前内存块全部回收。这个算法不会产生内存碎片,但是可用内存明显变少。

标记-整理算法

标记-整理算法与标记-清除算法类似,不同的是,不会直接对垃圾对象进行回收,而是把所有存活的对象都移动到一端,然后清理掉其他部分。

分代收集算法

分代收集算法根据对象的生命周期把内存划分为新生代和老年代,根据各自的特点选择合适的垃圾回收算法。对于新生代,大部分对象存活时间都很短,每次只有少量存活,可以选择复制算法,只需要复制少量对象就可以完成收集。对于老年代,对象存活时间长,可以选择标记-清除算法或标记-整理算法 。分代收集算法是目前商用虚拟机的主要回收算法。

创建新对象一般分配在新生代,而占用大量连续内存的字符串和大型数组则会分配在老年代。这是为了避免回收老年代时复制太多内存,降低效率。

虚拟机给每个对象定义了一个年龄计数器。第一次创建对象时直接分配在新生代,以后每经过一次垃圾回收年龄加一,年龄到达阈值后便会被移动到老年代。

每周 3 篇学习笔记或技术总结,面向有一定基础的 Java 程序员,内容涉及 Java 进阶、虚拟机、MySQL、NoSQL、分布式计算、开源框架等多个领域。关注作者或微信公众号 后端开发那点事儿 第一时间获取最新内容。

上一篇下一篇

猜你喜欢

热点阅读