概述
垃圾回收是一种自动内存管理方法,垃圾收集器定期的扫描内存中不再被使用的对象,并将该对象所占用的内存资源释放出来以供其他程序使用。 Java语言中,为了减轻开发人员的工作,同时增加系统的安全性和稳定性,java语言提供了垃圾回收器来自动检测对象的作用域,可以把不再被使用的存储空间释放掉。
相关面试问题
1、请简单描述一下垃圾回收器(GC)的基本原理是什么?
Java语言中,为了减轻开发人员的工作,同时增加系统的安全性和稳定性,java语言提供了垃圾回收器来自动检测对象的作用域,可以把不再被使用的存储空间释放掉。 对于GC来说,当某一对象被创建时,GC就开始监控这个对象。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”存活”的,哪些对象是”死亡”的。当GC确定一些对象已经“死亡”时,GC就回收这些内存空间。
2、垃圾回收器可以马上回收内存吗?并且有什么办法可以主动通知虚拟机进行垃圾回收呢?
可以通过执行System.gc(),主动通知GC运行,但是Java语言规范并不保证GC一定会执行。也就是说,程序员可以通过调用System.gc()通知GC回收内存,但具体执不执行回收,何时进行回收由GC自己决定。
3、有哪些算法可以判断对象是“存活”还是“死亡”?
- 引用计数算法:该算法给每个监控的对象添加一个引用计数器,当该对象被引用时,计数器就加1;当引用失效时,计数器减1;任何时刻计数器为0的对象就是不可能再被使用的。
- 可达性分析算法:这个算法的基本思路是通过一系列的成为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径成为引用链,当一个对象到GC Roots没有引用链项链时,则该对象不可用。如下图所示,对象object 5、object 6、object 7对象不可达。
4、有哪几种垃圾回收算法
- 标记-清除算法:分为“标记”和“清除”两个阶段,首先标记处所有需要回收的对象,在标记完成后同一回收所有被标记的对象。
- 复制算法:它将可用内存按熔炼划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块,然后再把已使用的内存空间一次清理掉。
- 标记-整理算法:分为“标记”和“整理”两个阶段。“标记”阶段与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清除,而是让所有存活的对象都向一段移动,然后直接清理掉边界以外的内存。
- 分代收集算法:该算法根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,根据不同代的特点采用不同的回收算法。例如,在新生代中,每次垃圾手机时都发现有大量对象“死亡”,只有少量存活,则使用复制算法;老年代由于存活率高,则使用“标记-清除”和“标记-整理”算法来进行回收。
5、java中内存泄漏是什么意思?什么场景下会出现内存泄漏的情况
Java中的内存泄露指的是不再会被使用的对象的内存不能被回收。如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。