讲一下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程序可以调用本地应用/或库,也可以被其他程序调用;
2.对象不能作为 GC Roots 的;所以GC Roots都是引用。