`
javayestome
  • 浏览: 1006835 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

非常详细GC学习笔记

阅读更多

这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转到这里。

GC学习笔记

一、GC特性以及各种GC的选择

1、垃圾回收器的特性

2、对垃圾回收器的选择

2.1连续VS.并行

2.2并发VS.stop-the-world

2.3压缩VS.不压缩VS.复制

二、GC性能指标

三、分代回收

四、J2SE5.0HotSpotJVM上的GC学习-分代、GC类型、快速分配

五、J2SE5.0HotSpotJVM上的GC学习-SerialGC

六、J2SE5.0HotSpotJVM上的GC学习-ParallelGC

七、J2SE5.0HotSpotJVM上的GC学习-ParallelCompactingGC

八、J2SE5.0HotSpotJVM上的GC学习-CMSGC

九、启动参数学习示例

一、GC特性以及各种GC的选择

1垃圾回收器的特性

·该回收的对象一定要回收,不该回收的对象一定不能回收

·一定要有效,并且要快!尽可能少的暂停应用的运行

·需要在时间,空间,回收频率这三个要素中平衡

·内存碎片的问题(一种解决内存碎片的方法,就是压缩)

·可扩展性和可伸缩性(内存的分配和回收,不应该成为跑在多核多线程应用上的瓶颈)

2对垃圾回收器的选择

2.1连续VS.并行

连续垃圾回收器,即使在多核的应用中,在回收时,也只有一个核被利用。
但并行GC会使用多核,GC任务会被分离成多个子任务,然后这些子任务在各个CPU上并行执行。
并行GC的好处是让GC的时间减少,但缺点是增加了复杂度,并且存在产生内存碎片的可能。

2.2并发VS.stop-the-world

当使用stop-the-world方式的GC在执行时,整个应用会暂停住的。
而并发是指GC可以和应用一起执行,不用stoptheworld

一般的说,并发GC可以做到大部分的运行时间,是可以和应用并发的,但还是有一些小任务,不得不短暂的stoptheworld

stoptheworldGC相对简单,因为heap被冻结,对象的活动也已经停止。但缺点是可能不太满足对实时性要求很高的应用。
相应的,并发GCstoptheworld时间非常短,并且需要做一些额外的事情,因为并发的时候,对象的引用状态有可能发生改变的。
所以,并发GC需要花费更多的时间,并且需要较大的heap

2.3压缩VS.不压缩VS.复制

GC确定内存中哪些是有用的对象,哪些是可回收的对象之后,他就可以压缩内存,把拥有的对象放到一起,并把剩下的内存进行清理。
在压缩之后,分配对象就会快很多,并且内存指针可以很快的指向下一个要分配的内存地址。

一个不压缩的GC,就原地把不被引用的对象回收,他并没有对内存进行压缩。好处就是回收的速度变快了;缺点呢,就是产生了碎片。

一般来说,在有碎片的内存上分配一个对象的代价要远远大于在没有碎片的内存上分配。

另外的选择是使用一个复制算法的GC,他是把所有被引用的对象复制到另外一个内存区域中。
使用复制GC的好处就是,原来的内存区域,就可以被毫无顾忌的清空了。但缺点也很明显,需要更多的内存,以及额外的时间来复制。

二、GC性能指标

窗体底端

几个评估GC性能的指标

·吞吐量应用花在非GC上的时间百分比

·GC负荷与吞吐量相反,指应用花在GC上的时间百分比

·暂停时间应用花在GCstop-the-world的时间

·GC频率顾名思义

·Footprint一些资源大小的测量,比如堆的大小

·反应速度从一个对象变成垃圾道这个对象被回收的时间

一个交互式的应用要求暂停时间越少越好,然而,一个非交互性的应用,当然是希望GC负荷越低越好。
一个实时系统对暂停时间和GC负荷的要求,都是越低越好。
一个嵌入式系统当然希望Footprint越小越好。

三、分代回收

窗体底端

什么是分代

当使用分代回收技术,内存会被分为几个代(generation)。也就是说,按照对象存活的年龄,把对象放到不同的代中。

使用最广泛的代,应属年轻代和年老代了。

根据各种GC算法的特征,可以相应的被应用到不同的代中。

研究发现:

·大部分的对象在分配后不久,就不被引用了。也就是,他们在很早就挂了。

·只有很少的对象熬过来了。

年轻代的GC相当的频繁,高效率并且快。因为年轻代通常比较小,并且很多对象都是不被引用的。

如果年轻代的对象熬过来了,那么就晋级到年老代中了。如图:

通常年老代要比年轻代大,而且增长也比较慢。所以GC在年老代发生的频率非常低,不过一旦发生,就会占据较长的时间。

总结

·年轻代通常使用时间占优的GC,因为年轻代的GC非常频繁

·年老代通常使用善于处理大空间的GC,因为年老代的空间大,GC频率低

四、J2SE5.0HotSpotJVM上的GC学习-分代、GC类型、快速分配

窗体底端

J2SE5.0update6HotSpot上有4GC

HotSpot上的分代

分成三部分:年轻代、年老代、永久代

很多的对象一开始是分配在年轻代的,这些对象在熬过了一定次数的younggc之后,就进入了年老代。同时,一些比较大的对象,一开始就可能被直接分配到年老代中(因为年轻代比较小嘛)。

年轻代

年轻代也进行划分,划分成:一个Eden和两个survivor。如下图:

大部分的对象被直接分配到年轻代的eden区(之前已经提到了是,很大的对象会被直接分配到年老代中),
survivor区里面放至少熬过一个YGC的对象,在survivor里面的对象,才有机会被考虑提升到年老代中。

同一时刻,两个survivor只被使用一个,另外一个是用来进行复制GC时使用的。

GC类型

年轻代的GCyoungGC,有时候也叫minorGC。年老代或者永久代的GC,叫fullGC,也叫majorGC

也就是说,所有的代都会进行GC

一般的,首先是进行年轻代的GC,(使用针对年轻代的GC),然后是年老代和永久代使用相同的GC。如果要压缩(解决内存碎片问题),每个代需要分别压缩。

有时候,如果年老区本身就已经很满了,满到无法放下从survivor熬出来的对象,那么,YGC就不会再次触发,而是会使用FullGC对整个堆进行GC(除了CMS这种GC,因为CMS不能对年轻代进行GC

快速分配内存

多线程进行对象建立的时候,在为对象分配内存的时候,就应该保证线程安全,为此,就应该进入全局锁。但全局锁是非常消耗性能的。

为此,HotSpot引入了ThreadLocalAllocationBuffersTLAB)技术,这种技术的原理就是为每个线程分配一个缓冲,用来分配线程自己的对象。

每个线程只使用自己的TLAB,这样,就保证了不用使用全局锁。当TLAB不够用的时候,才需要使用全局锁。但这时候对锁的时候,频率已经相当的低了。

为了减少TLAB对空间的消耗,分配器也想了很多方法,平均来说,TLAB占用Eden区的不到1%

五、J2SE5.0HotSpotJVM上的GC学习-SerialGC

窗体底端

串行GC

串行GC,只使用单个CPU,并且会stoptheworld

young的串行GC

如下图:


当发生ygc的时候,EdenFromsurvivor区会将被引用的对象复制到To这个survivor种。
如果有些对象在Tosurvivor放不下,则直接升级到年老区。

YGC完成后,内存情况如下图:

old区的串行GC

年老区和永久区使用的是Mark-Sweep-Compact的算法。

mark阶段是对有引用的对象进行标识
sweep是对垃圾进行清理
compact对把活着的对象进行迁移,解决内存碎片的问题

如下图:

何时使用串行收集器

串行GC适用于对暂停时间要求不严,在客户端下使用。

串行收集器的选择

J2SE5.0上,在非server模式下,JVM自动选择串行收集器。

也可以显示进行选择,在java启动参数中增加:-XX:+UseSerialGC

六、J2SE5.0HotSpotJVM上的GC学习-ParallelGC

窗体底端

并行GC

现在已经有很多java应用跑在多核的机器上了。

并行的GC,也称作吞吐量GC,这种GC把多个CPU都用上了,不让CPU再空转。

YGC的并行GC

YGC的情况,还是使用stop-the-world+复制算法的GC

只不过是不再串行,而是充分利用多个CPU,减少GC负荷,增加吞吐量。

如下图,串行YGC和并行YGC的比较:

年老区的并行GC

也是和串行GC一样,在年老区和永久区使用Mark-Sweep-Compact,利用多核增加了吞吐量和减少GC负荷。

何时使用并行GC

对跑在多核的机器上,并且对暂停时间要求不严格的应用。因为频率较低,但是暂停时间较长的FullGC还是会发生的。

选择并行GC

server模式下,并行GC会被自动选择。
或者可以显式选择并行GC,加启动JVM时加上参数:-XX:UseParallelGC

七、J2SE5.0HotSpotJVM上的GC学习-ParallelCompactingGC

ParallelCompactingGC

parallelCompactingGC是在J2SE5.0update6引入的。

parallelcompactingGCparallelGC的不同地方,是在年老区的收集使用了一个新的算法。并且以后,parallelcompactingGC会取代parallemGC的。

YGC的并行压缩GC

与并行GC使用的算法一样:stop-the-world和复制。

年老区的并行压缩GC

他将把年老区和永久区从逻辑上划分成等大的区域。
分为三个阶段:

1标记阶段,使用多线程对存在引用的对象进行并行标记。

2分析阶段,GC对各个区域进行分析,GC认为,在经过上次GC后,越左边的区域,有引用的对象密度要远远大于右边的区域。所以就从左往右分析,当某个区域的密度达到一个值的时候,就认为这是一个临界区域,所以这个临界区域左边的区域,将不会进行压缩,而右边的区域,则会进行压缩。

3压缩阶段,多各个需要压缩的区域进行并行压缩。

什么时候使用并行压缩GC

同样的,适合在多核的机器上;并且此GCFGC的时候,暂停时间会更短。

可以使用参数-XX:ParallelGCThreads=n来指定并行的线程数。

开启并行压缩GC

使用参数-XX:+UseParallelOldGC

八、J2SE5.0HotSpotJVM上的GC学习-CMSGC

ConcurrentmarksweepGC

很多应用对响应时间的要求要大于吞吐量。
YGC并不暂停多少时间,但FGC对时间的暂用还是很长的。特别是在年老区使用的空间较多时。
因此,HotSpot引入了一个叫做CMS的收集器,也叫低延时收集器。

CMSYGC

与并行GC同样的方式:stop-the-world加上copy

CMSFGC

CMSFGC在大部分是和应用程序一起并发的!
CMSFGC的时候,一开始需要做一个短暂的暂停,这个阶段称为最初标记:识别所有被引用的对象。
在并发标记时候,会和应用程序一起运行。
因为并发标记是和程序一起运行的,所以在并发标记结束的时候,不能保证所有被引用的对象都被标记,
为了解决这个问题,GC</span

分享到:
评论
2 楼 56553655 2011-11-13  
这个格式是好的:http://blog.csdn.net/fenglibing/article/details/6321453
1 楼 Willam2004 2011-07-09  
为什么在ubuntu下的chrome下预览,格式都乱了?

相关推荐

    5G-QoS-学习笔记.pdf

    (一) Qos mapping的流程 1. 信令流程 1) SMF从PCF/PCC等网元获取Qos信息; 2) UE或者AN发起PDU session modification过程,AMF转发给SMF; 3) SMF对AMF响应Nsmf_PDUSession_UpdateSMContext消息,这个消息中包含: ...

    深入Java虚拟机JVM类加载学习笔记

    深入Java虚拟机JVM类加载学习笔记:jvm java classloader 垃圾回收 gc

    AWB学习笔记

    关于手机camera方面的AWB学习笔记,主要讲述GC0329的AWB

    net学习笔记及其他代码应用

    Runtime.getRuntime().gc() 37.String s = new String(\"xyz\");创建了几个String Object? 答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 38.abstract class和interface有什么区别? 答: 声明...

    JVM学习笔记核心知识点整理

    JVM学习笔记核心知识点整理,包含类文件加载机制,运行时数据,JVM内存模型,GC算法,垃圾收集器分类等

    jvm学习笔记.zip

    jvm经典笔记

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

    C#技术内幕 学习笔记

    对象生存周期管理十分关键,因为.NET GC把对象到处移动,并且当对象不再使用时,自动处理这些对象。RCW服务告诉 .NET,应用程序正与托管.NET组件交互,同时又使非托管COM组件“觉得”COM对象是被传统的COM客户端调用...

    corejava的学习笔记

    -verbose[:class|gc|jni] enable verbose output -version print product version and exit -version:&lt;value&gt; require the specified version to run -showversion print product version and continue -jre-...

    Java学习笔记

    Java 到底有哪些优势? 1.跨平台(平台=OS) 可移植性 在不同的操作系统之上可以...gc 内存回收清理 Java 中的回收机制: 零引用回收 问题: System.gc(); Runtime.getRuntime().gc(); 调用gc 的下一行是否回收?不一定

    ORACLE学习笔记

    ORACLE 使用关系型数据库 解决了数据冗余问题(数据同步)。(DETAR乘阶)join一个表 , ON一个条件 关联多了,数据就慢. ... 管理工具:1.seckflash(常用) 2.isflash 3.em管理(gc) (趋势) 2.用户连接接口

    python的系统学习笔记,每个支持点都有代码案例说明

    # 简介 # 此项目为自学Python手记,每个支持点都有代码案例说明。...[垃圾回收gc](垃圾回收gc.md) [多线程](多线程.md) [时间模块](时间模块.md) [http模块](http模块.md) [常用内置模块](常用内置模块.md)

    java基础学习笔记 java整合技术 java工具类.rar

    健壮性:java的健壮性与自动垃圾回收机制有关,自动垃圾回收机制简称GC机制,java语言运行过程中产生的垃圾是自动回收的,不需要程序员关心。 可移植性:java程序可以做到一次编译,到处运行。在Windows操作系统上...

    JAVA-JVM-全面/发展史/GC.zip

    最全面的JAVA学习笔记

    Google《Android性能优化》学习笔记(下)

    1)Memory,GC,andPerformance众所周知,与C/C++需要通过手动编码来申请以及释放内存有所不同,Java拥有GC的机制。Android系统里面有一个GenerationalHeapMemory的模型,系统会根据内存中不同的内存数据类型分别执行...

    java8源码-akangaroo:学习笔记,完善中

    学习笔记较长,如果想查看文章的目录,chrome浏览器可以配合简悦插件使用,或者下载到本地使用Typora打开。 :hot_beverage: Java基础 Java容器 Java并发 数据结构和算法 数据结构 树 图 算法 分治 动态规划 回溯 ...

    Cisco Nexus 配置讲解

    Cisco Nexus 系列学习笔记.。

    leetcode下载-study:学习笔记

    gc 如何调整 CMS 垃圾回收器 锁 Lock 与 Sychronized 区别 Redis 分布式锁 Zookeeper 分布式锁 死锁产生原因 如何解决死锁 数据库死锁例子 JAVA 并发 AQS 源码 ReentrantLock 源码 Condition 源码 ConcurrentHashMap...

    c#笔记总结

    C#从入门到精通学习笔记.1.C#语言特性: 不可以直接操作内存,去掉了指针操作。用CLR中的GC来管理 面向对象:封装、继承、多态 支持HTML,XML,SOAP等 2.C#与.net框架的关系: C#只是.net框架所支持的一种语言。C#...

    Neural-GC:神经网络的格兰杰因果关系发现

    神经格兰杰因果关系Neural-GC存储库包含用于在多元时间序列中发现Granger因果网络的基于深度学习的方法的代码。 介绍了此处实现的方法。安装要安装代码,请克隆存储库。 您只需要Python 3 , PyTorch (&gt;= 0.4.0) , ...

Global site tag (gtag.js) - Google Analytics