GC算法--深入理解JVM内存结构,熟练GC垃圾回收机制,可以进行简单的JVM调优

                GC算法   GC频繁会导致请求响应时间过长

1.复制算法--年轻代的GC

2.标记清除算法(只1)

3.标记整理算法

分代收集


GC算法   GC频繁会导致请求响应时间过长
1.复制算法--年轻代的GC

        HotSpot JVM把年轻代分为三部分,1个Eden区和2个Survivor区(分别叫from和to) .默认比例为8:1:1

        一般情况下,新创建的对象都会被分配到Eden区(创建对象),这些对象经过一次MinorGC,如果仍然存活,将会被移到Survivor(分别叫from区和to区)区,对象在Survivor区中每熬过一次MinorGC,年龄就会增加1岁,当它能年龄增加到一定程度时,就会被移动到老年代中。

        因为年轻代中的对象基本都是期生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制整理算法,复制整理算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。(利用不充分)

        在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区Survivor区“To”是空的(是空的)。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为'To'的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满(右图中的From区被填满),“To”区被填满之后,会将所有对象移动到年老代中。

优点:不会产生内存碎片。全部复制但是另一块"To"会是空的利用效率不高

缺点:

(1)会开辟新的空间也就是 To survivor,用来保存有用对象

(2)复制对象会花费一些时间

2.标记清除算法(只1)

分为标记清除两阶段:首先标记出所有需要回收的对象,然后统一回收所有被标记的可回收对象

缺点:

1、标记阶段和清除阶段的效率都不高。

2、显而易见的,清除后产生了大量不连续的内存碎片,导致在程序运行过程中需要分配较大对象的时候,无法找到足够的连续内存而不得不提前触发一次垃圾收集动作。   不连续

3.标记整理算法

标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

优点:

        自带整理功能,这样不会产生大量不连续的内存空间,适合老年代的大对象(大多需要空间连续)存储。

算法小结:

时间效率:复制算法>标记清除算法>标记整理算法

内存整齐(空间效率保证空间的连续)度:复制算法=标记整理算法>标记清除算法

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

没有最好的算法,只有最合适的算法。

分代收集

当前商业虚拟机的垃圾收集都采用分代收集。此算法没啥新鲜的,就是将上述三种算法整合了一下。具体如下: 根据各个年代的特点采取最适当的收集算法

1、在新生代中,每次垃圾收集时都发现有大批对象死去只有少量存活那就选用复制算法。只需要付出少量存活对象的复制成本就可以完成收集。

2、老年代中因为对象存活率高、没有额外空间对他进行分配担保,就必须用标记-清除或者标记-整理。(第一次标记-清除然后都是标记-整理)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值