JAVA内存管理(二)对比直接和自动内存管理

雪域幽狐 2013-09-24 19:41 阅读:5276


本系列文章由作者@hunter129翻译,转载请注明出处。
第二章 直接 VS 自动内存管理

内存管理是这样的一些过程,识别哪些对象不再有用,回收(释放)这些对象使用的内存,使这些内存在随后的分配中可用。在一些编程语言中,内存分配是程序员的责任。这项复杂的任务导致了很多常见的错误,如怪异、错误的程序行为和程序崩溃。结果是,开发人员很大比例的时间都在调试解决这些错误。

在直接内存管理的程序中经常犯的一个错误是悬挂引用(dangling references)。对象使用的空间被回收时,可能还有其他对象引用着。如果一个对象拥有这样(悬挂)的引用,当它试图访问原始对象时,很可能这块空间已经分配给了新的对象,结果导致了未预期的访问。

另外一个在直接内存管理中常见的错误是内存泄露(space leaks)。内存分配完不再使用后却没有释放就会产生这样的错误。例如,你打算释放一个链表(linked list)使用的空间时犯了一个错误,只回收了链表的第一个对象,其余的对象就不再被引用了,然而这些对象脱离了程序的控制,再也无法使用或恢复。如果产生了足够的泄露,内存将持续消耗,直到再也没有可用的部分。

作为替代方案,一种称为垃圾收集(garbage collector)的自动内存管理方法正在被广泛使用,尤其是在现代的面向对象语言中。自动内存管理使得编写出更多抽象的接口、更多稳定代码成为可能。

垃圾收集避免了悬挂引用问题,因为被某处引用的对象永远不会被收集,内存不会被释放。垃圾收集同样解决了上面提到的内存泄露问题,因为不再被引用的内存将自动释放。
(译注:实际上java中依然有“内存泄露”问题,只是这种泄露与上文中提到的传统上的泄露不同。可以理解为对内存的不恰当使用,会导致垃圾收集频繁发生[本应存储对象的没有存储下来],或OOM错误[本来应释放的内存没有释放]。)

0条评论

登陆后可评论