中国领先的工业平台

返回贤集网 返回微头条
贤集网技术微头条APP获取

垃圾回收原来是这么回事

 东莞市寮步艺发铁艺制品厂

下载贤集网APP入驻自媒体

(点击上方公众号,可快速关注)


来源:翟志军,

showme.codes/2017-02-04/what-is-gc/

如有好文章投稿,请点击 → 这里了解详情


摘要:John McCarthy身为Lisp之父和人工智能之父,同时,他也是GC之父。1960年,他在其论文中首次发布了GC算法(其实是委婉的提出)。而Java的前身Oak是在1990发布的,利用JVM实现了跨平台。GC因此一举成名。


最近想复习一下JVM的知识。然后发现网上不少文章在写JVM的垃圾回收算法时,都比较偏向于具体实现,而少有站在更高角度来看垃圾回收算法的文章。而我本人想对垃圾回收算法有个全景的认识,所以,就找到了这本《垃圾回收的算法与实现》(以下简称《垃圾回收》)。本篇博客就是尝试对“全景”的总结。


以下为方便讨论,垃圾回收缩写成GC。


为什么要有GC


我时而听到C++程序员说我们是被GC惯坏了的一代。的确是这样的,我本人在学习GC算法时,大脑里第一问题就是为什么需要GC这样的东西。说明我已经认为GC是理所当然了。


总的一句话:没有GC的世界,我们需要手动进行内存管理,而手动内存管理是纯技术活,又容易出错。


既然我们写的大多程序都是为了解决现实业务问题,那么,我们为什么不把这种纯技术活自动化呢?但是自动化,也是有代价的。 这是我的个人理解,不代表John McCarthy本人的理解。


“垃圾”的定义


首先,我们要给个“垃圾”的定义,才能进行回收吧。书中给出的定义: > 把分配到堆中那些不能通过程序引用的对象称为非活动对象,也就是死掉的对象,我们称为“垃圾”。


GC的定义


因为我们期望让内存管理变得自动(只管用内存,不管内存的回收),我们就必须做两件事情: > 1. 找到内存空间里的垃圾 > 2. 回收垃圾,让程序员能再次利用这部分空间 [1] 只要满足这两项功能的程序,就是GC,不论它是在JVM中,还是在Ruby的VM中。


但这只是两个需求,并没有说明GC应该何时找垃圾,何时回收垃圾等等更具体的问题,各类GC算法就是在这些更具体问题的处理方式上施展手脚。


GC的历史


John McCarthy身为Lisp之父和人工智能之父,同时,他也是GC之父。1960年,他在其论文中首次发布了GC算法(其实是委婉的提出

最新回复

还没有人回复哦,抢沙发吧~

发布回复

为您推荐

热门交流