为什么说Loitering Object != Memory Leak ?
如果Loitering Object一直没有机会被覆盖,那不就是内存泄漏吗?老师怎么在视频里说不是呢?
13
收起
正在回答 回答被采纳积分+1
1回答
liuyubobobo
2022-10-11 06:51:04
首先,我们需要明确,我们讨论的“内存泄露”指的是同一个意思:即一片内存空间在程序的生存空间里,“永远”不可能被回收了。这里的关键是:因为程序设计的错误,它已经不可能被回收了。而不是空间的浪费。
实际上,因为 Java 有 GC,所以在的大多数情况下,这种内存泄露发生的可能性远远低于 C/C++。如果你学习过 C/C++ 就会明白,在 C/C++ 中,一不小心就会出现这种内存泄露。
在 Java 中,最经常发生内存泄露的场景比如,使用 static 类型的对象;其次是在处理资源的时候(比如 File 或者 stream),这也是 finally 关键字出现的原因;再有就是内部类引用外部类对象导致的循环引用的情况;再有就是在多线程程序中出现了。
==========
首先,如你的问题所说,loitering object 被覆盖的时候,其所指向的空间就被正确回收了。所以,这片内存没有被泄露,因为他是可被回收的。
其次,在这整个 Array 生命周期结束的时候,data 引用将结束他的生命周期,data 中的每一个引用也将结束他的生命周期,每一个 data[i] 指向的空间都将失去一个引用计数。如果没有其他引用的情况下,这些空间也将被正确回收。
所以,这不是内存泄露,因为这片空间是可以被回收的。但如果这个引用所指向的空间对你的程序逻辑没有贡献的话,这是内存的浪费。手动赋 null,将帮助 GC 更快地回收这片空间,而不是等到这片空间被覆盖或者 Array 的生存周期结束。
继续加油!:)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星