我认为,如果简单说“Java 存在内存泄漏问题”,那是在有意或无意地混淆视听。
首先要明确什么是“内存泄漏”。恐怕大多数人的概念里,“内存泄漏”指的是 C/C++ 里那种“分配了一块内存,用完后没有释放,也不再有指针指向这块内存”。程序执行到这,后面的程序再没有任何办法使用这块内存,却也永远无法释放它(除非程序终止)。
可以肯定地说,Java 中是不会出现上面这种情况的!
所谓“Java 的内存泄漏问题”,其实指的是另一种完全不同的情况,即所谓的“无意识保留”。也就是说,当程序执行到某处时,某个对象从程序逻辑上已经不再需要了,但从程序语法上却还保留着(被某个变量所引用),造成 GC 无法对其进行回收。这种所谓的“泄漏”,其危害程度相对比较小,而且往往能够“自愈”。
我们讨论“Java 是否存在内存泄漏问题”的时候,不要停留在得到一个“存在”或者“不存在”的结论,而是要搞清楚它的实际含义,这样才能真正对我们的软件开发工作有所助益。 |