课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习互联网编程开发的相关技术,而今天我们就通过案例分析来了解一下,java编程开发垃圾回收机制基础知识。
G1垃圾收集器
G1垃圾收集器的目标是将多处理器机器扩展到大量内存。
它试图以较高的概率满足垃圾收集暂停时间目标,同时实现较高的吞吐量而不需要进行配置。
G1的目标是使用当前的目标应用程序和环境,在延迟和吞吐量之间提供佳的平衡。
与吞吐量收集器相比,虽然G1收集器的垃圾收集暂停时间通常要短得多,但应用程序吞吐量也往往略低。
G1是默认收集器。
启用G1
G1垃圾回收器是默认回收器,因此通常不需要执行任何其他操作,您可以通过在命令行上提供-XX:+UseG1GC来显式启用它。
基本概念
G1是一个分代的、递增的、并行的、大部分并发的、stop-the-world和疏散垃圾收集器,它监视每个stop-the-world暂停的时间目标。
与其他收集器类似,G1将堆分为(虚拟的)年轻代和老年代。
空间回收的努力集中在年轻代身上,这样做效率高,偶尔的空间回收在老年代中。
G1的设计原则
G1的设计原则是"先收集尽可能多的垃圾(GarbageFirst)"。因此,G1并不会等内存耗尽(串行、并行)或者快耗尽(CMS)的时候开始垃圾收集,而是在内部采用了启发式算法,在老年代找出具有高收集收益的分区进行收集。
G1采用内存分区(Region)的思路,将内存划分为一个个相等大小的内存分区,回收时则以分区为单位进行回收,存活的对象复制到另一个空闲分区中。由于都是以相等大小的分区为单位进行操作,因此G1天然就是一种压缩方案(局部压缩);
同时G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;
G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor(tospace)堆做复制准备。G1只有逻辑上的分代概念,或者说每个分区都可能随G1的运行在不同代之间前后切换;
G1的收集都是STW的,但年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集),这样即使堆内存很大时,也可以限制收集范围,从而降低停顿。
应用程序停止的其他操作会花费更多时间,比如全局标记之类的整堆操作会与应用程序并行执行。为了使stop-the-world在空间回收方面的停顿时间缩短,G1逐步并行地进行空间回收。
G1通过跟踪以前应用程序行为的信息和垃圾收集暂停来构建相关成本的模型,从而实现可预测性。它利用这个信息来计算停顿时所做的工作量。例如,G1先在效率高的区域回收空间(这些区域大部分都是垃圾,因此取名为G1)。
G1主要通过撤离来回收空间:在选定的内存区域内找到的活动对象被复制到新的内存区域,并在处理过程中对其进行压缩。在完成疏散之后,以前被活动对象占用的空间将被应用程序重用以进行分配。
G1收集器不是实时收集器。它试图在更长的时间内以高概率实现设定的暂停时间目标,但在给定的暂停时间内并不总是绝对确定。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。