Java面试知识点解析-16 ——GC篇

借参加过的多场Java开发面试,应聘岗位均为Java开发方向,在不断的面试中,又仔细对Java知识点进行复习和总结,也算是重新学习一下Java吧。

推荐收藏链接:Java 面试知识点解析


1)如何判断一个对象是否已经死去?
  • 引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。

  • 可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。

2)垃圾回收算法有哪些?
  • 引用计数:
    原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

  • 标记-清除:
    此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。
    在这里插入图片描述

  • 复制算法:
    此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。
    在这里插入图片描述

  • 标记-整理:
    此算法结合了 “标记-清除” 和 “复制” 两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了 “标记-清除” 的碎片问题,同时也避免了 “复制” 算法的空间问题。
    在这里插入图片描述

  • 分代收集算法:
    分代收集算法并没有提出新的思想,只是根据对象存活周期的不同将内存划为几块。一般Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用适当的收集算法。
    在新生袋中每次垃圾手机时都会由大批对象死去,只有少量存活,那就用复制算法,只需要付出少量存活对象的复制成本就可以。老年代中对象存活率高、没有额外担保,所以必须使用“标记-清理”或者“标记整理算法。

3)GC什么时候开始?

答:GC经常发生的区域是堆区,堆区还可以细分为新生代、老年代,新生代还分为一个Eden区和两个Survivor区。

  • 对象优先在Eden中分配,当Eden中没有足够空间时,虚拟机将发生一次Minor GC,因为Java大多数对象都是朝生夕灭,所以Minor GC非常频繁,而且速度也很快;

  • Full GC,发生在老年代的GC,当老年代没有足够的空间时即发生Full GC,发生Full GC一般都会有一次Minor GC。大对象直接进入老年代,如很长的字符串数组,虚拟机提供一个-XX:PretenureSizeThreadhold参数,令大于这个参数值的对象直接在老年代中分配,避免在Eden区和两个Survivor区发生大量的内存拷贝;

  • 发生Minor GC时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则进行一次Full GC,如果小于,则查看HandlePromotionFailure设置是否允许担保失败,如果允许,那只会进行一次Minor GC,如果不允许,则改为进行一次Full GC。

4)引用的分类?
  • 强引用:通过new出来的引用,只要强引用还存在,则不会回收。

  • 软引用:通过SoftReference类来实现,用来描述一些有用但非必须的对象。在系统将要发生内存溢出异常之前,会把这些对象回收了,如果这次回收还是内存不够的话,才抛出内存溢出异常。

  • 弱引用:非必须对象,通过WeakReference类来实现,被弱引用引用的对象,只要已发生GC就会把它干掉。

  • 虚引用:通过PhantomReference类来实现,无法通过徐引用获得对象的实例,唯一作用就是在这个对象被GC时会收到一个系统通知。


我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫描二维码加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/alogtech6/article/details/89552859
今日推荐