JAVA面试题之六—讲一下GC的过程

讲一下GC的过程(中信银行一面、美团外卖一面、58用户平台一面、轻松集团)

年轻代垃圾回收,引起老年代内存不足,最终引起FullGC。

JDK1.8之后,Java官方的HotSpot JVM去掉了永久代,取而代之的是元数据区Metaspace。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存的大小有关。因此JDK1.8之后,就见不到java.lang.OutOfMemoryError: PermGen space这种由于永久代空间不足导致的内存溢出的问题了。

回收过程分两步:

1、找到要清除的对象;一般使用GC-ROOTS方法;没有Roots的类被清楚;
2、使用回收算法,清除需要回收的对象;

回收算法(车很多集团、美团外卖一面)

问题:有哪些回收算法?以及每种算法在哪些垃圾回收器中使用?

垃圾回收算法有四种:

  • 标记清除算法(CMS、G1)
  • 标记整理算法(老年代:parallel old和serial old垃圾回收器使用该算法)
  • 复制算法(新生代:serial new,parallel new和parallel scanvage)
  • 标记压缩算法

可达性分析,判断对象已死

两种方法:

  • GC-ROOTS:
    强引用导致的问题:当内存空间不足,系统撑不住了,JVM 就会抛出 OutOfMemoryError 错误。即使程序会异常终止,这种对象也不会被回收。这种引用属于最普通最强硬的一种存在,只有在和 GC Roots 断绝关系时,才会被消灭掉。
  • 引用计数法
    引用计数法 给对象增加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器就减1,任何时刻计数器为0的对象就是可能不再被使用的,即该对象就称为可被回收的对象。

什么样的对象可以作为GC roots(轻松集团)

概念:在发生 GC 的时候,一个对象,JVM 总能够找到引用它的祖先。找到最后,如果发现这个祖先已经名存实亡了,它们都会被清理掉。而能够躲过垃圾回收的那些祖先,比较特殊,它们的名字就叫作 GC Roots。

GC roots 大致可以分为三类:

1)活动线程相关的各种引用;
2)类的静态变量的引用;
3)JNI引用。

说明:

1.JNI Java Native Interface JAVA 本地接口,是一种编程框架,使得Java虚拟机中的Java程序可以调用本地应用/或库,也可以被其他程序调用;

扫描二维码关注公众号,回复: 13134561 查看本文章

2.对象不能作为 GC Roots 的;所以GC Roots都是引用。

猜你喜欢

转载自blog.csdn.net/Prepared/article/details/108899596