文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
解释GC的标记-整理算法及其优点
GC(垃圾收集)的标记整理算法是一种用于回收垃圾对象并释放内存空间的方法。
这个算法主要包含两个阶段:标记阶段和整理阶段。
标记阶段:
- 在这个阶段,垃圾收集器会遍历所有的对象,对于还在使用的对象进行标记。
- 在使用的定义可以是直接在使用,也可以是被其他在使用的对象引用。
整理阶段:
- 在标记阶段之后,垃圾收集器会进行整理,移动所有被标记为在使用的对象,使他们在内存中连续分布。
- 然后,它就可以一次性地回收所有未被标记的对象,也就是垃圾对象,从而释放大片连续的内存空间。
标记整理算法的一个主要优点是它可以有效地处理内存碎片问题
- 因为它会把所有在使用的对象整理到一起,释放出大片连续的内存空间。
不过,它的代价是需要移动对象,这会增加一定的开销。
在实际的应用场景中,标记-整理算法通常用于堆内存的垃圾回收
- 特别是处理老年代(
Old Generation
)的垃圾回收。
解释GC的标记-清除算法及其缺点
标记-清除(
Mark-Sweep
)是最早的垃圾收集算法之一其过程主要分为两个阶段:标记阶段和清除阶段。
标记阶段
- 这一阶段的任务是遍历所有的可达对象。
- 从一个固定的根对象(
root
)开始,递归地访问对象图。- 在访问到每一个可达对象时,都将其标记为可达。
- 在Java中,根对象通常包括全局变量和当前执行方法的局部变量。
清除阶段:
- 在标记阶段完成后,清除阶段开始。
- 在这个阶段,垃圾收集器会遍历堆内存,把未被标记(也就是不可达)的对象进行清除,回收其占用的内存。
标记-清除算法的优点是实现简单,且不需要移动存活对象。
但是,它有两个显著的缺点:
效率问题:
- 标记和清除两个过程的效率都不高。
空间问题:
- 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配大对象时
- 无法找到足够的连续内存,从而提前触发另一次垃圾收集动作。
因此,现代的垃圾收集器通常不单独使用标记-清除算法,而是结合其他算法一起使用
- 如标记-整理算法或分代收集算法,以解决其带来的效率和空间问题。
解释GC的复制算法及其适用场景
复制算法是垃圾收集中的一种常见算法,它主要被用于新生代的垃圾回收。
- 复制算法的基本思想是将内存分为两个相等的区域(或者不等也可以,如新生代中的Eden和Survivor区)
- 每次只使用其中一个区域。
- 当这个区域用完时,就把还活着的对象复制到另一个区域,然后再把已使用过的区域清空。
具体来说,例如在Java的新生代中,内存被分为一个Eden区和两个
Survivor
区(分别记为S0和S1)。大部分情况下,新创建的对象会被分配在Eden区。
当Eden区满时,就会触发一次Minor GC,GC会检查Eden区中的所有对象
- 把还活着的对象复制到一个
Survivor
区(如S0),然后把Eden区完全清空。- 在下一次Minor GC时,会再次检查Eden区和S0区
- 把还活着的对象复制到另一个
Survivor
区(如S1),然后清空Eden区和S0区,以此类推。复制算法的主要优点是:
- 它可以快速地回收垃圾对象,因为只需要清空已使用过的区域就可以了
- 而且,由于活着的对象会被复制到另一个区域,因此这个过程也自然地完成了内存的整理,避免了内存碎片的产生。
然而,复制算法也有一些缺点:
- 首先,它需要两个区域来进行复制,这意味着在任何时候
- 都有一半的内存空间是闲置的,这在内存紧张的情况下可能是一种浪费
- 其次,如果有大量对象需要复制,那么复制过程可能会消耗一定的时间和CPU资源。
不过,对于新生代这样对象存活率较低的区域,复制算法通常是一种非常高效的垃圾收集方式。
解释GC的可达性分析算法及其优势
GC可达性分析算法是垃圾收集器用来判断哪些对象:
- 是活的(即仍然可能被程序使用)和哪些对象是死的(即不再被程序使用)的一种算法。
这个算法的基本思想是通过一系列的称为
GC Roots
的对象作为起始点从这些节点开始向下搜索,搜索所走过的路径称为引用链(
Reference Chain
)。
- 当一个对象到
GC Roots
没有任何引用链相连时,则证明此对象是不可用的。在Java语言中,可作为
GC Roots
的对象包括以下几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象:
- 比如方法中创建的对象引用。
方法区中类静态属性引用的对象:
- 比如类中的静态变量。
方法区中常量引用的对象:
- 比如字符串常量池中的引用。
本地方法栈中JNI(即一般说的Native方法)引用的对象。
通过这种方式,GC可达性分析算法可以找出所有被程序还可能会使用的对象。
- 在标记阶段完成后,未被标记的对象将被视为不可达,之后在清除阶段被回收。