文档章节

java7中G1垃圾收集器使用和流程总结

Hi徐敏
 Hi徐敏
发布于 2015/10/13 15:38
字数 1324
阅读 167
收藏 1
点赞 0
评论 0

1.   支持

fully supported in Oracle JDK 7 update 4

2.       Goals

并行和并发: 具有CMS一样的多线程操作能力

压缩:在保持短的停顿时间的基础上尽可能消除碎片

可预测性:GC停顿时间更加可预测

高效:不会对系统吞吐量产生较大影响

节约:GC操作不会浪费太多的heap空间

3. 使用范围

多核,6G以上的heap

4. 概览


Note1. 实际上,各region合起来逻辑上表现为整体的E,S,O,所有对象分散存储在各个region里面;


Note2. 灰色部分表示暂未使用;


Note3. 还有一种类型的region,叫做Humongous regions,用来存储超过一个region50%的大对象,实际上是连续的若干个region的组合。目前G1对大对象的优化比较弱,因此建议避免使用大对象。


Note4. 整个heap会被划分为2000个左右的region,每个region最小为1Mb,最大为32Mb。


Note5. Region和region之间未必是连续的。


5. Young GC


2


如果当前heap的状态如上,发生YGC的时候,岁数到了一定的对象将会移动到老年代。


3


最终结果如下:


4


Note1. 存活的对象会被拷贝到一个新的S区或者O区里面;


Note2. E区和S区的大小在这里将会根据之前的相关信息(例如STW的时间等)进行重新计算;


Note3. 该操作是并发多线程执行的;


Note4. 该操作是STW的。


6. Old GC


阶段


描述


(1)初始化标记(STW) 在此阶段,G1 GC 对根进行标记。该阶段与常规的年轻代垃圾回收密切相关。

(2)根region扫描 在初始标记的存活区扫描对老年代的引用,并标记被引用的对象。该阶段与应用程序(非 STW)同时运行,并且只有完成该阶段后,才能开始下一次 STW 年轻代垃圾回收。

(3)并发标记阶段 G1 GC 在整个堆中查找可访问的(存活的)对象。该阶段与应用程序同时运行,可以被 STW 年轻代垃圾回收中断。

(4)重新标记阶段 该阶段是 STW 回收,帮助完成标记周期。清空 SATB   (snapshot-at-the-beginning)区,跟踪未被访问的存活对象,并执行引用处理。

(5)清理阶段 执行统计和 RSet 清理STW 操作。G1会识别完全空闲的区域和可供进行混合垃圾回收的区域。清理阶段在将空白区域重置并返回到空闲列表时,该阶段为部分并发。

(*)拷贝 分散或者拷贝存活的对象到那些没有使用的region。

下面是其一个流程图:


5


(1)     初始化标记

该阶段附在YGC上,标记那些可能有引用对象的O区


6


(2)       并发标记阶段

7


Note1. 活跃度会在该阶段并发计算;


Note2. 该阶段没有清理。


(3)       重新标记阶段(SWT)

如果发现某个region上所有的对象都失效了,他们将会在重新标记阶段直接移除。


8


(4)       拷贝/清理阶段(SWT)

G1会拷贝找出活跃度最低的那些region,然后和YGC一样做清理


9


(5)       清理后的结果

10


 7. 使用方式


java -Xmx50m -Xms50m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar


选项和默认值


描述


-XX:+UseG1GC 开启G1

-XX:MaxGCPauseMillis=n 最大GC停顿时间,这是个软目标,JVM将尽可能(但不保证)停顿小于这个时间

-XX:InitiatingHeapOccupancyPercent=n 堆占用了多少的时候就触发GC,默认为45

-XX:NewRatio=n new/old 比,默认为2

-XX:SurvivorRatio=n eden/survivor比,默认为8

-XX:MaxTenuringThreshold=n 新生代到老年代的岁数,默认是15

-XX:ParallelGCThreads=n 并行GC的线程数,默认值会根据平台不同而不同

-XX:ConcGCThreads=n 并发GC使用的线程数

-XX:G1ReservePercent=n 设置作为空闲空间的预留内存百分比,以降低目标空间溢出的风险。默认值是 10%。

-XX:G1HeapRegionSize=n 设置的 G1 区域的大小。值是2的幂,范围是1 MB 到32 MB。目标是根据最小的 Java 堆大小划分出约 2048 个区域。

8. 最佳实践


年轻代大小:避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小,因为固定年轻代的大小会覆盖暂停时间目标。

暂停时间目标:每当对垃圾回收进行评估或调优时,都会涉及到延迟与吞吐量的权衡。G1是增量垃圾回收器, 其吞吐量目标是 90% 的应用程序时间和 10%的垃圾回收时间。因此,暂停时间目标不要太严苛。目标太过严苛表示您愿意承受更多的垃圾回收开销,而这会直接影响到吞吐量。

掌握混合垃圾回收:当您调优混合垃圾回收时,请尝试以下选项

-XX:InitiatingHeapOccupancyPercent

-XX:G1MixedGCLiveThresholdPercent 和 -XX:G1HeapWastePercent

-XX:G1MixedGCCountTarget 和 -XX:G1OldCSetRegionThresholdPercent

参考:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html

http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html

http://www.infoq.com/cn/articles/jdk7-garbage-first-collector


本文转载自:http://ju.outofmemory.cn/entry/65368

共有 人打赏支持
Hi徐敏
粉丝 119
博文 40
码字总数 67954
作品 0
静安
架构师
谈谈Java内存管理

对于一个Java程序员来说,大多数情况下的确是无需对内存的分配、释放做太多考虑,对Jvm也无需有多么深的理解的。 但是在写程序的过程中却也往往因为这样而造成了一些不容易察觉到的内存问题,...

Galy_绿
2016/07/11
22
0
g1垃圾回收器与cms垃圾回收器详解及最佳实践

G1垃圾收集器入门 说明 concurrent: 并发, 多个线程协同做同一件事情(有状态) parallel: 并行, 多个线程各做各的事情(互相间无共享状态) 参考: What’s the difference between concurrency ...

行者
01/13
0
0
G1垃圾收集器入门

G1垃圾收集器入门 说明 concurrent: 并发, 多个线程协同做同一件事情(有状态) parallel: 并行, 多个线程各做各的事情(互相间无共享状态) 参考: What’s the difference between concurrency ...

renfufei
2014/12/12
0
0
推荐书籍:《Java性能调优指南》

本书作者是Java性能和Java HotSpot 虚拟机领域的佼佼者,帮助你利用现代软工实践提高性能,避免常见错误,从实战生涯中总结技巧和窍门。 利用G1克服并行、串行和CMS垃圾收集器的局限性了解G...

ddddd8
2017/11/27
0
0
Java垃圾回收机制-垃圾收集器(二)

上篇总结了常见的垃圾收集算法,这里回顾下常见的垃圾收集器。 上图展示了7种不同分代的垃圾收集器,如果两个收集器之间存在连线,说明他们之间可以搭配使用。虚拟机所处的区域,代表它是新生...

Real_man
06/18
0
0
G1垃圾回收器

我们先回顾一下主流Java的垃圾回收器(HotSpot JVM)。本文是针对堆的垃圾回收展开讨论的。 堆被分解为较小的三个部分。具体分为:新生代、老年代、持久代。 绝大部分新生成的对象都放在Eden区...

此鱼不得水
2016/03/21
69
0
【006】【JVM——垃圾收集器总结】

JVM——垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论,垃圾收集据是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现没有规定,不同的厂商、不同版本的虚拟机所...

俊超
2015/03/19
0
0
我们的垃圾收集器

我们的垃圾收集器 原文链接 (译者注:这篇博文发表在2008年,虽然年代有些久远,但是文中说到的垃圾收集器我们至今还在使用,作者也谈到了对于G1垃圾收集器的期望。) 最近我在白板上给客户...

nj-zhangmq
2016/12/20
14
0
JVM的大管家:自动内存管理机制

和C语言手动管理内存不同,JVM实现了自动内存管理机制,这也是Java语言的一大特点。 简而言之,JVM自动内存管理机制是JVM中面向堆(Heap)的内存管理机制,该机制包括两大部分 为对象分配合适...

登高且赋
2017/12/16
0
0
Java垃圾收集器——深入理解Java虚拟机

前言 这一讲说了三天了,主要刚接触这些,所以写的慢一些,你们可以凑在一起看,但是一起看会觉得有点乱,不容易全部记住,反而慢慢熟悉比较好,一口吃不成一个大胖子,最近群里交流的也是觉...

JAVA大神
2017/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
52分钟前
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部