我记得在我刚开始学习Java的时候,总是有很多学习Java的前辈们在反复地为我讲述Java的优点,比如“Write Once, Run Anywhere”之类,但是我记得印象最深的还是垃圾收集器,因为可以不用自己操心内存的管理。不过当时只知道这些脏活累活都让垃圾收集器这个家伙给干掉了,其他的就不知云里雾里。而且当时还老是觉得把这么重要的事情交给这个家伙总有点不放心,毕竟没有自己亲自动手来得踏实。
不过,随着了解的深入,越来越感觉到这个家伙的可爱。毕竟我们不用再亲自去过问烦人的内存管理,不用时刻提心吊胆是不是忘记了释放哪个对象,而且这个家伙确实把内存打理得井井有条。既然这个家伙做着这么重要的事情,而且给我们带来了这么多的好处,我想我们还是有必要来了解一下它。至少,要是有一天哪个不负责任的程序员把自己程序的错误都推到垃圾收集器的身上,你就可以义正言辞地揭穿他的谎言。而且只有了解它,你才可能真正地掌握它,用好它甚至优化它。
垃圾收集(Garbage Collection,简称GC)其实是一种动态存储管理技术。主要是按照特定的垃圾收集算法(Garbage Collection algorithm 简称GC算法)来实现自动资源回收的功能。简单地说,就是将那些程序中释放内存的代码由系统在后台自动地完成,这样的一种机制就被称作垃圾收集,能提供这种功能的编程语言,我们就说它支持GC,比如典型的Java、C#、Python等,本文主要讨论HotSpot(详见说明一)系列Java虚拟机(JVM)中的GC。
我相信每个初次接触GC的人都会有此一问?想要弄清楚GC如此流行的原因,就必须首先了解它的作用,它到底能干些什么?
显而易见它省去了程序员自己管理内存的麻烦和危险。在没有GC的年代,我们必须及时地释放我们霸占的内存,但同时在释放之前又必须弄清楚这些内存是不是能够被释放。由于人工管理内存的不确定性,很容易造成内存泄漏(memory leak)或者悬空指针(dangling pointer)甚至系统崩溃,这对于许多要求高性能的应用来说无疑是不可接受的。而且,系统内存是这么的娇贵,任何的不小心都可能是致命的,因此GC的使用也一定程度上提升了系统的安全。
同时,我觉得GC的流行也是当今计算思想的一种趋势。现在的操作系统和编程工具越来倾向于提供足够多的缺省服务,程序员只需要了解如何来使用这些服务就可以。乐观主义者当然认为这有利于我们从繁重的低级工作中解脱出来,有利于我们将有限的时间投入到更重要的事情之中。而悲观论者则认为,虽然麻烦和危险,但我们还是需要尽可能地自己来管理内存。而且随着越来越多的底层机制的缺省实现,程序员变得越来越傻瓜,这和最初的使用计算机的思想也是格格不入的。本来我们只是需要了解计算机是如何工作,是如何实现该某某功能,现在却演变成某某厂家的某某产品是如何使用的,这也许就是现代化的悲哀吧!
此外,GC本身的缺陷也在一定程度上影响着GC的使用,比如性能问题以及GC算法的不完备性,早先采用的某些GC算法就不能保证100%收集到所有的废弃内存。当然随着GC算法的不断改进以及软硬件运行效率的不断提升,这些问题似乎都可以迎刃而解。