GC算法:
GC部分 1、什么是需要被回收的垃圾?运行程序中没有任何指针指向的对象,就是需要被回收的垃圾。
2、为什么要进行垃圾回收?计算机内存有限,如果不回收,就会一直占用内存空间,最终导致OOM。
3、早期的垃圾回收机制是什么样的?有什么缺点?早期垃圾回收:使用者自己手动申请空间,手动释放空间。
缺点一旦忘了释放,会造成内存泄露。
4、java的垃圾回收机制形式?优缺点是什么?自动内存管理: 优点: 降低内存溢出与内存泄露风险,让程序员更专注于业务逻辑。
缺点: 一点出现问题,难以定位与改错。
5、垃圾回收发生的区域是哪里?垃圾回收发生在堆和方法区。 重点是堆。
频繁发生在年轻代(堆)、较少发生在老年代(堆)、基本不动 元空间(方法区)。
6、垃圾回收过程主要有哪几个阶段?标记阶段、清除阶段
7、标记阶段,如何判断对象已死?主要有两种方法:
①、引用计数法:
定义:对每个对象保存一个计数器属性,如果有其他对象引用了,则+1,引用失效后-1,若 为0,则表示可以回收。
优点:实现简单、便于识别、判定效率高,回收没有延迟。
缺点:
1、计数器也占用空间,增加空间消耗。
2、每次引用变化,都要计算。增加时间消耗。
3、无法解决循环引用问题。(根本缺点)
java没有采用引用计数法,python使用了,python采用手动解除和使用弱引用weakref的方式来应对以上缺点。
②、可达性分析法:
定义:以根节点集合GCRoots为起始点,按照从上至下的方式搜索被根节点集合直接或间接连接的对象,视为可达对象。非可达对象则视为可回收对象。
优点:可以解决循环引用问题
8、GCRoots包括哪几种对象?①、虚拟机栈中引用的对象
②、本地方法栈Jni中引用的对象
③、方法区类静态属性所引用的对象
④、方法区中常量所引用的对象
⑤、所有被同步锁synchronized持有的对象
⑥、java虚拟机内部的引用
除此之外,根据垃圾回收器及垃圾回收区域的不同,也有一些可能被临时作为GCRoot的对象。
9、GC时 STW (stop the world)的原因?可达性分析法必须在一个能够保证一致性的快照中进行
10、在GC中对象的三种状态?可触及、可复活、可回收
11、如何判断对象可回收?(是问题7的进一步细化说法)一个对象是否可回收要经过两个标记阶段。
1、经过可达性分析法 判断 对象是否可达,若可达,则不可收回。若不可达,标记为 不可达。
2、对不可达对象进行判断,是否重写了finalize()方法,若没有重写,则 标记为可回收。
若重写了 ,则执行,执行后对象可能被复活,则不可回收。若没有被复活,则可回收。
3、finalize()只能被执行一次。若已执行过,则第二次运行到此时直接将对象标记为可回收。
12、垃圾回收的清除阶段有哪些算法?1、标记-清除算法
2、复制算法
3、标记-压缩算法
13、标记-清除算法1、算法描述: ①、标记可达对象 ②、对堆内存进行遍历,清除非可达对象
2、缺点:①、效率不算高 ②、GC时,停止整个应用程序 ③、清理出的内存空间是不连续的,容易产生内存碎片。
详细说下第三个缺点原因:
标记-清除算法的清除并不是真正的清除,而是将可以被清除的对象地址保存在空闲的地址列表中,下次有新对象需要加载时,逐个判断空闲列表中每个垃圾的空间是否够存放,如果够,则存放。



