GC学习笔记

来源:互联网 发布:孕妇尿常规检查数据 编辑:程序博客网 时间:2024/05/22 02:18

1. GC特性以及各种GC的选择

1.1 垃圾回收器的特性

该回收的对象一定要回收,不该回收的对象一定不能回收
一定要有效,并且要快!尽可能少的暂停应用的运行
需要在时间,空间,回收频率这三个要素中平衡
内存碎片的问题(一种解决内存碎片的方法,就是压缩)
可扩展性和可伸缩性(内存的分配和回收,不应该成为跑在多核多线程应用上的瓶颈)
对垃圾回收器的选择

1.2 连续 VS. 并行

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

1.3 并发 VS. stop-the-world

当使用stop-the-world 方式的GC在执行时,整个应用会暂停住的。
而并发是指GC可以和应用一起执行,不用stop the world。
一般的说,并发GC可以做到大部分的运行时间,是可以和应用并发的,但还是有一些小任务,不得不短暂的stop the world。
stop the world 的GC相对简单,因为heap被冻结,对象的活动也已经停止。但缺点是可能不太满足对实时性要求很高的应用。
相应的,并发GC的stop the world时间非常短,并且需要做一些额外的事情,因为并发的时候,对象的引用状态有可能发生改变的。
所以,并发GC需要花费更多的时间,并且需要较大的heap。

1.4 压缩 VS. 不压缩 VS. 复制

在GC确定内存中哪些是有用的对象,哪些是可回收的对象之后,他就可以压缩内存,把拥有的对象放到一起,并把剩下的内存进行清理。
在压缩之后,分配对象就会快很多,并且内存指针可以很快的指向下一个要分配的内存地址。
一个不压缩的GC,就原地把不被引用的对象回收,他并没有对内存进行压缩。好处就是回收的速度变快了;缺点呢,就是产生了碎片。
一般来说,在有碎片的内存上分配一个对象的代价要远远大于在没有碎片的内存上分配。
另外的选择是使用一个复制算法的GC,他是把所有被引用的对象复制到另外一个内存区域中。
使用复制GC的好处就是,原来的内存区域,就可以被毫无顾忌的清空了。但缺点也很明显,需要更多的内存,以及额外的时间来复制。

2. GC性能指标

几个评估GC性能的指标

吞吐量: 应用花在非GC上的时间百分比
GC负荷 : 与吞吐量相反,指应用花在GC上的时间百分比
暂停时间 : 应用花在GC stop-the-world 的时间
GC频率 : 顾名思义
Footprint : 一些资源大小的测量,比如堆的大小
反应速度 : 从一个对象变成垃圾道这个对象被回收的时间

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

3. 分代回收

3.1 什么是分代

当使用分代回收技术,内存会被分为几个代(generation)。也就是说,按照对象存活的年龄,把对象放到不同的代中。
使用最广泛的代,应属年轻代和年老代了。
根据各种GC算法的特征,可以相应的被应用到不同的代中。
研究发现:
大部分的对象在分配后不久,就不被引用了。也就是,他们在很早就挂了。
只有很少的对象熬过来了。
年轻代的GC相当的频繁,高效率并且快。因为年轻代通常比较小,并且很多对象都是不被引用的。
如果年轻代的对象熬过来了,那么就晋级到年老代中了。如图:
这里写图片描述
通常年老代要比年轻代大,而且增长也比较慢。所以GC在年老代发生的频率非常低,不过一旦发生,就会占据较长的时间。

3.2 总结

年轻代通常使用时间占优的GC,因为年轻代的GC非常频繁
年老代通常使用善于处理大空间的GC,因为年老代的空间大,GC频率低

【转自:http://blog.csdn.net/fenglibing/article/details/6321453】

0 0
原创粉丝点击