gc 即垃圾收集机制是指jvm 用于释放那些不再使用的对象所占用的内存
java 语言并不要求jvm 有 gc,也没有规定gc 如何工作
不过常用的jvm 都有gc,而且大多数gc 都使用类似的算法管理内存和执行收集操作
在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能
有些垃圾收集专用于特殊的应用程序
比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应用程序则注重整体效率
理解了应用程序的工作负荷和jvm 支持的垃圾收集算法,便可以进行优化配置垃圾收集器
垃圾收集的目的在于清除不再使用的对象
gc 通过确定对象是否被活动对象引用来确定是否收集该对象
gc 首先要判断该对象是否是时候可以收集
两种常用的方法是引用计数和对象引用遍历
引用计数 引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm 必须适当增减引用数
当某对象的引用数为0 时,便可以进行垃圾收集
对象引用遍历 早期的jvm 使用引用计数,现在大多数jvm 采用对象引用遍历
对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象
如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集
在对象遍历阶段,gc 必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象
下一步,gc 要删除不可到达的对象
删除时,有些gc 只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除( sweeping)
这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大
因此,许多gc 可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间
为此,gc 需要停止其他的活动活动