2022年8月更文挑战6-java垃圾回收算法

83 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

java垃圾回收算法

前文

本文内容为对于java所采用的垃圾回收算法的一些总结与整理,主要是对于知识的回顾,其中难免存在不准确之处。

如何判断对象需要垃圾回收

想要进行垃圾回收,首先需要判断对象是否已经成为垃圾,需要进行垃圾回收。正常来说有两种判断的方法。一个是引用计数法,另一个是可达性分析。

所谓引用计数法,也就是在对象被引用时进行计数,一次引用就加一,而引用结束就减一。但引用计数法当面对循环引用时,会无法定位该对象是否应该被回收。

另一种算法则是可达性分析法,也是jvm所采用的垃圾判断算法。这个算法是指从根对象gc root出发,向下查找。如果能够到达对象,则证明该对象不是垃圾无法被回收,反之则证明该对象可以被回收。那么什么是gc root呢,gc root是一组对象:栈引用的对象、静态变量引用的对象、方法区中常量引用的对象、本地方法栈引用的对象。

垃圾回收算法

下面来看一下垃圾回收算法的操作,其实主要的操作也就是标记、清除以及复制几个步骤,组合成了不同的算法。

标记清除算法

标记清楚算法是指将所有的待清理的对象进行标记,标记后直接在原位置上进行清除。很明显,直接清除的方式会在内存中产生碎片,使得在某些情况下明明内存空间足够,但大文件无法进行存储。

标记整理算法

标记整理算法与标记清除算法有所不同,这里是将所有存活对象移动到内存中的另一侧,所有垃圾对象也就在内存中的同一侧。经过这个操作,也就可以将所有垃圾对象统一清除,又不会产生内存碎片。当然这个算法的效率要低于标记清楚,同时还需要更大的内存空间。

复制算法

复制算法则是需要额外的一块空间,将存活对象复制一份移动过去,再将原空间中的所有对象统一进行清除。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。