为什么要切换 Java 的默认垃圾回收器,以及 Java 垃圾回收方法在近来发生的一些变化。
1. 基本概念
垃圾回收是系统的一种“清理”活动,独立于应用程序的主处理线程,试图找出不再被使用的内存并将其释放以便可以继续重用。
Dijkstra 对垃圾回收的定义清晰地指出,引用计数是自动内存管理的一种形式,但不属于垃圾回收。
引用计数会在程序运行时更新每个对象的元数据(例如,在对一个引用类型对象的某个字段赋值时)。元数据的更新需要在应用程序线程上进行,因此不能清晰地将其划分为独立的活动。
回收算法从 root(一组已知是存活对象)开始,通过跟踪指针来确定存活对象。
这些跟踪回收器实现了图算法,将堆内存划分为存活的和可回收的。
在现代垃圾回收文献中,并发(Concurrent)和并行(Parallel)都被用来描述回收算法。它们听起来像是同义词,但实际上有着完全不同的含义:
-
并发——回收线程独立于应用程序线程运行;
-
并行——使用多个线程来执行垃圾回收算法。
它们可以被看成是另外两个术语的对立面——并发是 stop-the-world(STW)的对立面,并行是 single-thread(单线程)的对立面。
实际的垃圾回收器分为多个阶段,每个阶段还可能具备多种特征。
例如,某个阶段可能是单线程并发,或者是并行 STW。
注意:并发回收器比 STW 回收器要复杂得多。它们在计算开销方面要大得多,而且它们的行为还有需要注意的地方。
其他你应该知道的垃圾回收术语:
-
Exact——Exact 回收器拥有足够的类型信息,能够区分 int 和指针之间的区别。
-
驱逐(Evacuate)——移动(驱逐)存活对象到内存的另一个区域。在回收周期结束时,源内存区域变成空的,可以被重用。
-
压缩(Compact)——在回收周期结束时,存活的对象被连续地放在内存的前部区域,剩下的区域可被重用。
Exact 是一种保守模式,缺乏精确的信息,因此通常会造成更大的内存浪费。
一些资料还提到了移动回收器——包括压缩和驱逐算法。但这两种类型之间的差异太大,把它们组合在一起通常用处不大。
非移动回收器被称为就地回收器。这些算法需要知道可用内存块的列表才能够处理内存碎片以及合并可用的内存块。

(编辑:唐山站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|