JVM垃圾算法和GC三算法及面试题分享

本期课程的内容概要:熟悉JVM架构与GC垃圾回收机制以及相应的堆参调优,有过在linux进系统调优的经验。

本次课程的主题内容:

1、JVM组成结构

2、JVM体系结构概览

3、栈(Stak)

4、堆(Heap)

5、JVM垃圾收集(Java Garbage Collection)

6、GC三算法

7、GC试题

上节课1-4节课的内容:

浅谈JVM原理及性能调优分享(在同名的公众号里可以看到)

一、JVM垃圾收集(Java Garbage Collection)

JVM垃圾算法和GC三算法及面试题分享_第1张图片

JVM垃圾算法和GC三算法及面试题分享_第2张图片

 

 

堆内存调优简介

 

二、GC三算法

1、 GC算法总体概述

JVM在进GC时,并每次都对上三个内存区域起回收的,部分时候回收的都是指新代。因此GC按照回收的区域分了两种类型,种是普通GC(MinorGC),种时全局GC(FullGC)

普通GC:只针对新代区域的GC

全局GC:针对年代的GC,偶尔伴随对新代的GC以及堆永久代的GC。

2、 复制算法:MinorGC(普通GC)

新代使的MinorGC,这种GC算法采的是复制算法(Copying),频繁使

复制-->清空-->互换

1 )原理

MinorGC会把Eden中的所有或的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old Generation中,也即旦收集后,Eden区就变成空的了。

当对象在Eden(包括个Survivor区域,这假设是from区域)出后,在经过次MinorGC后,如果对象还存活,并且能够被另外块Survivor区域所容纳(上已经假设为from区域,这应为to区域,即to区域够的内存空间来存储Eden和from区域中存活的对象),则使复制算法将这些仍然还存活的对象复制到另外块Survivor区域(即to区)中,然后清理所有使过的Eden以及Survivor区域(即from区),并且讲这些对象的年龄设置为1,以后对象在Survivor区没熬过次MinorGC,就将对象的年龄+1,当对象的年龄达到某个值时(默认15,通过-XX:MaxTenuringThreshold 来设定参数),这些对象就会成为年代。

==-XX:MaxTenuringThreshold设置对象在新代中存活的次数==

2) 解释

HotSpot JVM把年轻代分为了三部分:1个Eden区和两个Survivor区,默认例是8:1:1,

般情况下,新创建的对象都会被分配到Eden区,这些对象经过第

次的MinorGC后,如果仍然存活,将会被移到Survivor区。对象Survivor区中每熬过

次MinorGC,年龄就增加岁,当他的年龄增加到定程度时,就会被移动到年代中。因为年轻代中的对象基本都是朝夕死(80%以上),所以在年轻代的垃圾回收算法使的是复制算法,复制算法的基本思想就是将内存分为两块,每次只其中块,当这块内存完就将活着的对象复制到另外块上。复制算法不会产内存碎。

==复制要交换,谁空谁是to==

3 )劣势

复制算法弥补了标记清除算法中,内存布局混乱的缺点。

1. 浪费了半的内存,太要命了

2. 如果对象的存活率很,我们可以极端点,假设是100%存活率,那么我们需要将所有对象都复制遍,并将所有引地址重置遍。复制这作所花费的时间,在对象存活率达到定程度是,将会变的不可忽视。所以从以上描述不难看出,复制算法想要使,最起码对象的存活率要常低才,且最重要的是,我们必须要客服50%的内存的浪费

3、 标记清除/标记整理算法:

FullGC叫MajorGC(全局GC)年代般是由标记清除或者是标记清除与标记整理的混合实现

1 )标记清除(Mark-Sweep)

原理

1. 标记(mark)从根集合开始扫描,对存活的对象进标记

2. 清除(Sweep)扫描整个内存空间,回收未被标记的对象,使free-list记录可以区域。

劣势

1. 效率低(递归与全堆对象遍历),且在进GC的时候,需要停应程序,这会导致户体验常差劲

2. 清理出来的空闲内存不是连续的,我们的死亡对象都是随机的出现在内存的各个落,限制把他们清除之后,内存的布局然会乱七糟,为了应付这点,JVM不得不维持个内存的空闲列表,这是种开销,且在分配数组对象的时候,寻找连续的内存空间会不太好找。

2) 标记整理(Mark-Compact)

1. 标记与标记-清除样

2. 压缩整理再次扫描,并往段滑动存活对象

效率不,不仅要标记所有存活对象,还要整理所有存活对象的引地址。从效率上说,效率要低于复制算法

4 、总结

内存效率:复制算法>标记清除算法>标记整理算法

内存整度:复制算法=标记整理算法>标记清除算法

内存利率:标记整理算法=标记清除算法>复制算法

分代收集算法

引计数法:

缺点:每次对对象赋值时均要维护引计数器,且计数器本身也有定的消耗较难处理循环引

三、GC试题

1 、StackOverFlowError和OutOfMemoryError,谈谈你的理解;

2、般什么时候会发GC?如何处理?

答:Java中的GC回有两种回收:年轻带的MinorGC,年代的FullGC;新对象创建时如果伊甸园空间不会触发MinorGC,如果此时年代的内存空间不会触发FullGC,如果空间都不抛出OutOfMemoryError。

3. GC回收策略,谈谈你的理解;

答:年轻代(伊甸园区+两个幸存区),GC回收策略为“复制”;年区的保存空间

般较,GC回收策略为“整理压缩”。

4. GC是什么;

答:频繁收集Young区,较少收集Old区,基本不动Perm区

5. JVM内存模型以及分区,需要详细到每个区放什么;

6. 堆的分区:Eden,suirival from to,年代,各特点;

7. GC的三种收集法:标记清除、标记整理、复制算法的原理特点;

你可能感兴趣的:(架构师,Java基础)