1、显示内存管理有什么弊端
手动内存管理一般被称为显示内存管理,显示内存管理经常发生两种情况:
- 引用悬挂
当一个被某个引用变量正在使用的内存空间,在重新分配过程中被释放掉了,释放后,该引用变量就处于悬挂状态(所引用的对象已经不存在了)。
如果这个被悬挂引用变量,试图操作原来对象的时候,由于该对象本身的内存空间已经被手动释放掉了(已经不存在了),所以这个执行结果是不可预知的。
- 内存泄漏
当某些引用变量不再引用该内存对象的时候,而该对象原本占用的内存并没有被释放,这种情况就是内存泄漏。
例如,对某个链表进行了内存分配,因为手动分配内存不当,仅仅让引用变量指向了某个元素所处的内存空间,就使得这些元素所处的内存空间对程序来说处于不可达状态,而且这些对象所占有的内存也不能够被再使用,这个时候就发生了内存泄漏。
而这种情况一旦在程序中发生,就会一直消耗系统的可用内存直到可用的内存耗尽。对计算机而言,内存泄漏是非常严重的,会使得本来正常运行的程序直接因为内存不足而中断。与Java中的Exception并不是一个级别的错误。
对于显示内存管理来说,手动管理内存成本太高,风险很大。所以大多数纯面向对象语言而言,都提供了语言本身具有的内存特性:自动化内存管理。比如Java,提供了一个垃圾回收器(Garbage Collector,GC),自动内存管理提供了更加可靠的代码使得内存能够在程序里面进行合理的分配。
2、java的自动内存管理有什么好处
java的自动内存管理(隐式内存管理)可以解决显示内存管理的问题:引用悬挂和内存泄漏。
- 对于引用悬挂
JVM隐藏了对内存的管理,所以不会对正在使用的内存空间进行释放,也就不会出现引用悬挂。
- 对于内存泄漏
一旦有对象没有被任何引用变量引用时,也就是说这些对象在JVM的内存池里面成为了不可引用对象,垃圾回收器会直接回收掉这些对象的内存(当然需要满足一些规则,具体看这里:[java垃圾回收机制是什么][2])。
[2]: