有关垃圾回收需要注意的问题

经典的垃圾收集器

▲新老生代垃圾收集器关系图

▲serial/serial old收集器框图,线程,各采用什么算法;serial收集器客户端默认收集器,好处是

▲ParNew收集器实质上是Serial收集器的多线程并行版本,采用什么算法;ParNew收集器在JDK9之前的作用是和CMS配合,是默认的服务端收集器; ParNew收集器和serial收集器的对比

▲Parallel Scavenge收集器和ParNew收集器相似,算法是,区别为其特点是关注点不同和自适应调节策略 ;吞吐量是什么,高吞吐量则可以最高效率地利用处理器资源;控制吞吐量的两个参数,控制最大垃圾收集停顿时间运行代码的时间与垃圾处理时间的比值,为什么不能随意设置最大垃圾收集停顿时间?自适应调节策略开关参数的好处

▲serial old收集器线程,算法;该收集器的主要意义是在客户端,在服务端

▲Parallel Old收集器线程,算法;在注重吞吐量或者处理器资源较为稀缺的场合, 都可以优先考虑Parallel Scavenge加Parallel Old收集器这个组合

▲CMS收集器框图,关注点是,算法是;四个步骤,初始标记标记GCroots单线程,并发标记标记对象图(增量更新),重新标记标记增量更新加的对象引用 多线程;优点是并发收集,短时间停顿;三个主要缺点,1对处理器资源敏感。四个核心为分界,会导致用户线程变慢。2无法处理浮动垃圾且需要预留足够空间。并发清除阶段的垃圾(浮动垃圾)只能等到下次。GC前需要预留足够空间分配给用户线程,因为是并发收集,如果空间不够则会并发失败,启动serial old收集器,停顿时间更久。3清除算法会产生空间碎片,解决办法是先进行几次清除算法,再进行一次整理算法。

▲Garbage First收集器是服务端模式下的默认垃圾收集器,算法是标记-整理和标记-复制;G1开创的基于Region的堆布局是把连续的Java堆划分为多个大小相等的独立区域(Region和Humongous),每一个Region都可以根据需要,动态的扮演新生代的Eden空间、Survivor空间,或者老年代空间;G1具体的垃圾处理思路:每个region的价值维护成优先级列表,在用户指定的停顿时间内回收最高价值的region;四个步骤,初始标记标记GCroots单线程,并发标记标记对象图(原始快照),最终标记处理原始快照重新扫描的引用 多线程,筛选回收先筛选价值优先级列表,原数据复制到新region,多线程,;G1的优点:并非纯粹地追求低延迟, 官方给它设定的目标是在延迟可控的情况下获得尽可能高的吞吐量,取得关注吞吐量和关注延迟之间的最佳平衡;G1的问题及解决办法,1跨region区域的引用对象,解决办法是使用记忆集避免全堆作为GC Roots扫描。2并发标记阶段和用户线程之间不能导致标记错误,解决办法是原始快照方法。3怎么建立可靠的时间停顿模型?使用衰减均值为基础,和平均值不同,记录最近的回收成本;和CMS比G1的优点:可以指定最大停顿时间、 分Region的内存布局、 按收益动态确定回收集 、没有空间碎片。缺点:内存占用和额外执行负载高 ;CMS和G1的选择:目前在小内存应用上CMS的表现大概率仍然要会优于G1, 而在大内存应用上G1则大多能发挥其优势, 这个优劣势的Java堆容量平衡点通常在6GB至8GB之间

 

 

STW出现的时机

1、根节点搜索

2、标记复制中复制阶段,因为要移动对象

3、标记整理中整理阶段,因为要移动对象

4、CMS初始标记,重新标记

5、G1初始标记,最终标记,筛选回收

 

垃圾收集器的选择

1、看应用程序的关注点是什么,吞吐量?延迟?内存占用?

2、看程序运行的基础环境,系统架构?操作系统?

3、看JDK的版本,oracleJDK?openJDK?等等

 

内存分配与回收策略

1、对象优先在eden区分配,eden满了触发minorGC,活着的对象复制到survivor区,如果survivor区不够则转移到老年代。下一次eden满了触发minorGC,eden和survivor区活着的对象复制到另一个survivor区。

2、通过一个参数可以让对象大于某个值时直接分配到老年代,避免在Eden区及两个Survivor区之间来回复制, 产生大量的内存复制操作。

3、在新生代经过15次minorGC仍然存活的对象会被分配到老年代。

4、动态年龄判定,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半, 年龄大于或等于该年龄的对象就可以直接进入老年代, 无须等到-XX:MaxTenuringThreshold中要求的年龄

5、分配担保:Minor GC之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果大于则安全,如果小于则查看是否允许担保失败,如果允许,则查看最大可用的连续空间是否大于平均晋升大小,如果大于则冒险GC,如果小于和如果不允许,则进行fullGC。

后来的JDK取消了查看是否允许担保失败,默认了允许担保失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值