垃圾收集是程序自动发现和回收应用程序不再使用或不能访问的内存的过程。这种回收过程不需要程序员的参与。
与程序员显式地释放内存相比,垃圾收集提供了几点好处。它消除了悬挂指针和内存泄露。它也使得接口设计和编程变得更简单,因为不再需要传统上用于确保内存正确释放的机制(如C++中的“智能指针”)。另外,因为程序员不必担心内存释放,程序开发就能够更快地进行。
但是,垃圾惧也不是没有缺点。垃圾收集程序通常运行得较慢,因为系统需要确定何时释放和回收那些不再使用的内存。另外,系统有时会多分配一些内存,不能在最佳的时机释放内存。
实现垃圾收集的一种方法是利用“引用计数”。这需要追踪有多少个变量引用到一个对象。在一开始,会有一个引用指向一块内存。如果对引用它的变量进行拷贝,那么引用计数就会增加。当引用一个对象的变量改变了值,或超过了作用范围,对象的引用计数就会减少。如果引用计数变为0,这个对象的内存就会被释放:如果没有变量保持对这个对象的引用,那么这个对象(以及它占用的内存)就不会再使用了。引用计数很简单,相对也比较快。但是,它不能解决循环引用的问题。
第二种垃圾收集的方法称为"标记和清除"。首先,内存管理器会标记程序中所有线程能够访问的对象。然后,所有未标记的对象都会被释放,或被清除。(可达)
标记和清除解决了循环引用的情况,但它的效率也较低。垃圾收集器在应用程序执行的不同时间点执行,发生垃圾收集时可能会导致应用程序暂停。
摘自《程序员面试宝典》第二版,机械工业出版社,P188.