深入探索JVM垃圾回收:ARM服务器垃圾回收的挑战和优化
上QQ阅读APP看书,第一时间看更新

1.5 内存管理

内存管理也称为垃圾回收(Garbage Collection),指的是虚拟机在应用程序运行时管理应用程序使用的内存。Java代码中只需要分配内存而不需要考虑释放内存,内存释放的工作交由虚拟机处理。虚拟机在内存管理中通常要做以下4方面的事情。

1)分配(Allocate):从OS请求内存,虚拟机需要考虑何时请求内存,请求内存的粒度。

2)使用(Use):针对应用程序的请求,设计连续内存或者非连续内存的管理,为应用程序提供高速内存分配。

3)回收(Recycle):当虚拟机管理的内存都被使用时,需要识别内存中的活跃对象,对活跃对象保留或者对非活跃对象释放,完成非活跃对象占用内存的回收,并将回收后的内存重新用于应用程序的分配。

4)释放(Free):向OS归还内存,虚拟机需要考虑何时释放内存,释放内存的粒度等。

不是所有的虚拟机都包含分配释放这两个步骤,主要原因是虚拟机在实现时可以借助一些内存管理库来代替自己提供这些功能。

另外,需要指出的是,这里所说的使用和回收是大家常提到的分配和回收。本节使用分配和使用来区别虚拟机向OS请求内存及应用程序向虚拟机请求内存。为了保持阅读的一致性,后文统一使用分配和回收替代此处的使用和回收。

然而设计和实现一款垃圾回收器并不容易,不同的应用场景对于垃圾回收的诉求也不相同。一款垃圾回收器主要从以下几个方面衡量。

1)吞吐量:指的是在一段时间内回收的内存量。吞吐量越大说明垃圾回收器的效率越高。

2)停顿时间:指的是垃圾回收器在垃圾回收过程中可能会要求应用暂停以配合垃圾回收的工作。停顿时间越长,则说明垃圾回收器对应用的影响越大,停顿时间越短,说明垃圾回收器对应用的影响越小。

3)数据访问的局部性:垃圾回收器在进行垃圾回收时可能会调整内存中活跃对象的位置,当对象的位置发生变化后会影响应用访问内存的速度,从而影响应用程序执行的效率。

4)额外资源消耗:垃圾回收器实现时都需要额外的内存管理其内部数据结果。不同的垃圾回收器采用的算法不同,使用的数据结果也不同,占用的额外资源也不同。通常来说,额外资源消耗越少,说明垃圾回收器越优秀。

本书后面将详细介绍JVM中实现的垃圾回收器,读者在阅读相关章节时可以从这个几个方面思考垃圾回收器实现的优劣。