微信号:grzlwx

介绍:光荣之路官方资讯

《代码的未来》读书笔记:内存管理与GC那点事儿(一)

2015-10-14 23:20 光荣之路

一、内存是有限的

  近年来,我们的电脑内存都有好几个GB,也许你的电脑是4G,他的电脑是8G,公司服务器内存是32G或者64G。但是,无论内存容量有多大,总归不是无限的。实际上,随着内存容量的增加,软件的内存开销也在以同样的速率增加着。因此,最近的计算机系统会通过“双重”幻觉,让我们以为内存容量是无限的。

  第一重幻觉:垃圾回收(GC)机制

  在C/C++中,内存空间的分配是由人工手动进行管理的,当需要内存空间时,要请求OS进行分配,不需要的时候则需要返回给OS。如果不再需要的内存空间没有及时返还给OS,这些无法访问的内存空间就会一直保留下来,造成内存的白白浪费,最终引发性能下降和产生抖动。

  将内存管理,尤其是内存空间的释放实现自动化,这就是GC

  第二重幻觉:OS提供的虚拟内存

  所谓虚拟内存,就好比是将书桌上的比较老的文件先暂时收到抽屉里,用空出来的地方来摊开新的文件。在计算机中,体现在在内存容量不足时将不经常访问的内存空间中的数据写入硬盘,以增加“账面上”可用内存容量的手段(想想我们的内存和硬盘容量对比就知道了)。

  BUT,如果在书桌和抽屉之间频繁进行文件的交换,工作效率肯定会下降。如果每次要看一份文件都要先收拾书桌再到抽屉里面拿的话,那工作根本就无法进行了。

  虚拟内存也有同样的缺点:硬盘的容量比内存大,但也只是相对的,速度却非常缓慢,如果和硬盘之间的数据交换过于频繁,处理速度就会下降,表面上看起来就像卡住了一样,这种现象称为抖动(Thrushing)。相信很多人都有过计算机停止响应的经历,而造成死机的主要原因之一就是抖动。

二、GC的基本方式

2.1 标记清除方式

  标记清除是最早的GC算法,其原理是:首先从根开始将可能被引用的对象用递归的方式进行标记,然后将没有标记到的对象作为垃圾进行回收

  下图直观地展示了标记清除算法的大致原理:

  ① 初始阶段:

  ② 标记阶段:

  其中,红色背景白色字体的对象为已标记的对象。重复这一阶段步骤,已标记的对象会被视为“存活”的对象,而没有被标记的对象就将被进行回收。

  ③ 清除阶段:

  将前面阶段中没有被标记的对象进行回收,这一操作被称为清除阶段。在扫描的同时,还需要将存活对象的标记清除掉,以便于下一次GC操作做好准备。标记清除算法的处理时间,是和存活对象与对象总数的总和相关的。

  标记清除算法的缺点:在分配了大量对象并且其中只有一小部分存活的情况下,所消耗的时间会大大超过必要的值,这是因为在清除阶段还需要对大量死亡对象进行扫描

2.2 复制收集方式

  复制收集克服了标记清除的缺点,其基本原理是:将从根开始被引用的对象复制到另外的空间中,然后再将复制的对象所能够引用的对象用递归的方式不断复制下去

  下图直观地展示了复制手机的大致原理:

  ① 初始阶段:

  ② 复制收集阶段:

复制阶段-1

复制阶段-2

  ③ 清除阶段:

  在清除阶段会将旧空间废弃掉,也就可以将死亡对象所占用的空间一口气全部释放出来,而没有必要再次扫描每个对象。下次GC的时候,现在的新空间也就成为了下次的旧空间。

  复制收集的缺点是:和标记方式相比,将对象复制一份所需要的开销比较大,因此在“存活”对象比例较高的情况下,反而比较不利。

(未完待续)

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。


 
            
 
            
 
            
 
           
 
           
 
           
 
           
 
           
 
           
 
           
 
           
 
           
 
           

感谢作者,传播测试知识、技能与正能量!
欢迎来稿,分享你的测试生活!735821166@qq.com

光荣之路软件测试培训

官网:http://www.gloryroad.cn/

微信公众号:gloryroadtrain

性能测试QQ群:415987441
软件测试招聘QQ群: 203715128
自动化3群QQ: 371211499

 
光荣之路 更多文章 今天晚上的 linux 公开课- Awk 编程 7月28日(今天)晚上的 linux 公开课- shell编程 8月4日(今天)晚上的 linux 公开课- shell编程 9月1日(本周一)晚8点半,光荣之路Web自动化系列基础课—javascript第二讲 推荐本好书《与机器赛跑》
猜您喜欢 学习c++的50条建议 C++快速实现xml文件的xml节点读写 逗逼程序猿养成记(四) Python爬虫:一些常用的爬虫技巧总结 学习Java需要什么基础?