本期课程的内容概要:熟悉JVM架构与GC垃圾回收机制以及相应的堆参调优,有过在linux进系统调优的经验。
1、JVM组成结构
2、JVM体系结构概览
3、栈(Stak)
4、堆(Heap)
5、JVM垃圾收集(Java Garbage Collection)
6、GC三算法
7、GC试题
上节课1-4节课的内容:
浅谈JVM原理及性能调优分享(在同名的公众号里可以看到)
堆内存调优简介
JVM在进GC时,并每次都对上三个内存区域起回收的,部分时候回收的都是指新代。因此GC按照回收的区域分了两种类型,种是普通GC(MinorGC),种时全局GC(FullGC)
普通GC:只针对新代区域的GC
全局GC:针对年代的GC,偶尔伴随对新代的GC以及堆永久代的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%的内存的浪费
FullGC叫MajorGC(全局GC)年代般是由标记清除或者是标记清除与标记整理的混合实现
1 )标记清除(Mark-Sweep)
原理
1. 标记(mark)从根集合开始扫描,对存活的对象进标记
2. 清除(Sweep)扫描整个内存空间,回收未被标记的对象,使free-list记录可以区域。
劣势
1. 效率低(递归与全堆对象遍历),且在进GC的时候,需要停应程序,这会导致户体验常差劲
2. 清理出来的空闲内存不是连续的,我们的死亡对象都是随机的出现在内存的各个落,限制把他们清除之后,内存的布局然会乱七糟,为了应付这点,JVM不得不维持个内存的空闲列表,这是种开销,且在分配数组对象的时候,寻找连续的内存空间会不太好找。
2) 标记整理(Mark-Compact)
1. 标记与标记-清除样
2. 压缩整理再次扫描,并往段滑动存活对象
效率不,不仅要标记所有存活对象,还要整理所有存活对象的引地址。从效率上说,效率要低于复制算法
内存效率:复制算法>标记清除算法>标记整理算法
内存整度:复制算法=标记整理算法>标记清除算法
内存利率:标记整理算法=标记清除算法>复制算法
分代收集算法
引计数法:
缺点:每次对对象赋值时均要维护引计数器,且计数器本身也有定的消耗较难处理循环引
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的三种收集法:标记清除、标记整理、复制算法的原理特点;