1. 简介
今天,应用程序同时为数千甚至数百万用户提供服务的情况并不少见。此类应用程序需要大量内存。但是,管理所有内存可能很容易影响应用程序性能。
为了解决这个问题,Java 11 引入了 Z 垃圾收集器 (ZGC) 作为实验性垃圾收集器 (GC) 实现。
在本文中,我们将了解 ZGC 如何在 TB 级别的堆上保持较低的暂停时间。
2. 主要概念
要了解 ZGC 的工作原理,我们需要了解内存管理和垃圾收集器背后的基本概念和术语。
2.1. 内存管理
物理内存是我们的硬件提供的 RAM。
操作系统 (OS) 为每个应用程序分配虚拟内存空间。
当然,我们将虚拟内存存储在物理内存中,OS 负责维护两者之间的映射。这种映射通常涉及硬件加速。
2.2. 多重映射
多重映射是指虚拟内存中有特定的地址,它们指向物理内存中的同一个地址。由于应用程序通过虚拟内存访问数据,因此它们对这种机制一无所知(而且它们也不需要)。
实际上,我们将虚拟内存的多个范围映射到物理内存中的同一范围。
我们稍后会看到,ZGC 需要它来发挥作用。此外,它还提供了一些安全性,因为它分隔了应用程序的内存空间。
2.3. 重定位 (Relocation)
由于我们使用动态内存分配,普通应用程序的内存会随着时间的推移而变得碎片化。这是因为当我们在内存中间释放一个对象时,那里仍然存在一个可用空间的间隙。随着时间的推移,这些差距会累积起来,我们的内存将看起来像一个由交替的可用空间和已用空间区域组成的棋盘。
当然,我们可以尝试用新对象填补这些空白。为此,我们应该扫描内存以查找足够大以容纳我们的对象的可用空间。这样做是一项昂贵的操作,特别是如果我们每次想要分配内存时都必须这样做。此外,内存仍将是碎片化的,因为我们可能无法找到具有我们需要的确切大小的空闲空间。因此,物体之间会有间隙。当然,这些差距更小。此外,我们可以