为什么说Loitering Object != Memory Leak ?

为什么说Loitering Object != Memory Leak ?

如果Loitering Object一直没有机会被覆盖,那不就是内存泄漏吗?老师怎么在视频里说不是呢?
下载视频          

正在回答 回答被采纳积分+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 的生存周期结束。


继续加油!:)

  • 提问者 洛奇2019 #1

    老师的意思和我原来想的一样

    2022-10-11 07:19:01
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2589    人
  • 解答问题       1090    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师