
-
一、头条一面:JVM 从 GC 角度看,堆的分区情况?
-
二、美团一面:说下JVM的垃圾回收算法?
-
三、滴滴一面:你知道哪几种垃圾回收器,各自的优缺点?
-
四、字节二面:JVM 各区域间是如何协同工作的?
-
五、蚂蚁金服一面:说下 G1 收集器?
-
六、字节二面:System.gc() 和 Runtime. getRuntime(). gc()会做什么事情?
-
七、京东二面:讲下 jvm 调优思路?
-
八、阿里一面:什么情况下触发垃圾回收?
-
九、美团一面:有在⼯作时间中使⽤过 jstat, jmap, mat⼯具吗?能给⼀个实际的例⼦说明⼀下吗?
-
十、增加 Eden 区,Minor GC 的间隔变长了,会不会导致 Minor GC 的时间增加?
一、头条一面:JVM 从 GC 角度看,堆的分区情况?
答:java 堆从GC角度可分为老年代和新生代。其中新生代又分为Eden区和两个Survivor 区(以下简称S0区和S1区)
为什么要将堆内存分为两块而不是直接一个老年代就行?
答:因为JAVA对象90%以上的对象都是朝生夕死的,其中GC回收的成本很高,为了提高性能所以将新生成的对象放在Eden区,将扛过多次GC的“老家伙”放在老年代
那为什么新生代还需要继续细分?
答:因为Eden区的绝大部分对象寿命很短,那么Eden每次满了清理垃圾,存活的对象被迁移到老年区,老年区满了,就会触发Full GC,Full GC是非常耗时的,设立s区的一个目的就是在Eden区和老年代中增加一个缓冲池,放一些“年纪不够老”的对象,增加垃圾回收性能
Survivor 区会进行垃圾回收吗?
答:会,但是并非主动进行的垃圾回收,是Eden区在进行垃圾回收的时候顺带回收、默认Eden区和 s0 ,s1 区的比例是 8:1:1。
直接分成1块Eden区和1块s区不行吗?
答:这涉及到年轻代的垃圾回收算法,(复制算法)设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入S1区(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生),接着新对象继续分配在Eden区和另外那块开始被使用的Survivor区,然后始终保持一块Survivor区是空着的,就这样一直循环使用这三块内存区域
二、美团一面:说下JVM的垃圾回收算法?
问题:说下JVM的垃圾回收算法?
下面介绍七种回收算法:
1、可达性分析算法(标记阶段)
原理:可达性分析算法是以根对象集合(GCRoots)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达。虚拟机栈、本地方法栈、方法区、字符串常量池 等地方对堆空间进行引用的,都可以作为GC Roots进行可达性分析。
2、标记-清除算法(年轻代清除阶段)
原理:当堆中的有效内存空间(available memory)被耗尽的时候,就会停止整个程序(也被称为stop the world),然后进行两项工作,第一项则是标记,第二项则是清除 标记:Collector从引用根节点开始遍历,标记所有被引用的对象。一般是在对象的Header中记录为可达对象。清除:Collector对堆内存从头到尾进行线性的遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其回收
缺点:
-
标记清除算法的效率不算高。
-
在进行GC的时候,需要停止整个应用程序,用户体验较差。
-
这种方式清理出来的空闲内存是不连续的,产生内碎片,需要维护一个空闲列表。
3、复制算法(年轻代清除阶段)
因为标记-清除算法的缺点,由此发明了复制算法。原理:将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。
优点:复制过去以后保证空间的连续性,不会出现“碎片”问题。
缺点:需要多余的内存空间。
4、标记整理算法(老年代清除阶段)
背景:复制算法的高效性是建立在存活对象少、垃圾对象多的前提下的。这种情况在新生代经常发生,但是在老年代,更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活对象较多,复制的成本也将很高。因此,基于老年代垃圾回收的特性,需要使用其他的算法。
原理:第一阶段和标记清除算法一样,从根节点开始标记所有被引用对象。第二阶段将所有的存活对象压缩到内存的一端,按顺序排放。之后,清理边界外所有的空间。
标记-压缩算法的最终效果等同于标记-清除算法执行完成后,再进行一次内存碎片整理,因此,也可以把它称为标记-清除-压缩(Mark-Sweep-Compact)算法。
优点:
消除了标记-清除算法当中,内存区域分散的缺点,我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可。消除了复制算法当中,内存减半的高额代价。
缺点:从效率上来说,标记-整理算法要低于复制算法。移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址 移动过程中,需要全程暂停用户应用程序。即:STW。
5、分代收集算法
背景:不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点使用不同的回收算法,以提高垃圾回收的效率。
年轻代:复制算法 老年代:由标记-清除或者是标记-清除与标记-整理的混合实现。
6、增量收集算法
原理:如果一次性将所有的垃圾进行处理,需要造成系统长时间

最低0.47元/天 解锁文章
86万+

被折叠的 条评论
为什么被折叠?



