Java 内存泄漏总是需要一个长寿命的对象吗?
这句话是真是假,还是表述不当: “在Java中,内存泄漏必须始终与长寿命对象相关。” 在本文中,我只是指常规对象,而不是一般的系统资源(文件描述符等) 长寿对象的一个例子可能是单例对象(不管怎样,通常是实现的),它的寿命与应用程序运行的时间一样长 误导 虽然这句话在技术上是正确的,但内存泄漏是由比预期寿命更长的对象造成的。具有误导性Java 内存泄漏总是需要一个长寿命的对象吗?,java,memory-leaks,Java,Memory Leaks,这句话是真是假,还是表述不当: “在Java中,内存泄漏必须始终与长寿命对象相关。” 在本文中,我只是指常规对象,而不是一般的系统资源(文件描述符等) 长寿对象的一个例子可能是单例对象(不管怎样,通常是实现的),它的寿命与应用程序运行的时间一样长 误导 虽然这句话在技术上是正确的,但内存泄漏是由比预期寿命更长的对象造成的。具有误导性 虽然该语句在技术上是正确的,但内存泄漏是由比预期寿命更长的对象引起的。该语句是正确的,但其格式很差。当不再需要对象后,对象仍被引用,导致内存泄漏 我能想到的内存泄漏
虽然该语句在技术上是正确的,但内存泄漏是由比预期寿命更长的对象引起的。该语句是正确的,但其格式很差。当不再需要对象后,对象仍被引用,导致内存泄漏 我能想到的内存泄漏的唯一其他原因是Java应用程序未能释放JNI本机库中的资源
有趣的文章。这句话是正确的,但措词不当。当不再需要对象后,对象仍被引用,导致内存泄漏 我能想到的内存泄漏的唯一其他原因是Java应用程序未能释放JNI本机库中的资源
有趣的文章。取决于长寿命的具体情况,包括/排除JRE bug,内存泄漏的含义(内存泄漏只占应用程序生存时间的一半是什么?),以及一些垃圾收集器特殊情况(G1应改善这种情况)等等 好吧,没有进一步的上下文的问题表述得很糟糕,但是,与Pyrostical相反,我倾向于说它在技术上是错误的,至于内存泄漏的任何实际定义,我认为与你描述的长寿对象没有任何关系
当然,可以说,如果堆栈上没有引用(这最终取决于main的执行时间),或者某个地方没有其他根引用,那么什么都不存在;但有了这样的语义学,这个问题就变得毫无意义了。这就像说如果没有计算机,我就无法运行Java应用程序。Hooray赢得了0美元的价格。这取决于长寿命的具体情况,包括/排除JRE bug,内存泄漏的含义(内存泄漏只占应用程序生存时间的一半是什么?),以及一些垃圾收集器特殊情况(G1应改善这种情况)等等 好吧,没有进一步的上下文的问题表述得很糟糕,但是,与Pyrostical相反,我倾向于说它在技术上是错误的,至于内存泄漏的任何实际定义,我认为与你描述的长寿对象没有任何关系
当然,可以说,如果堆栈上没有引用(这最终取决于main的执行时间),或者某个地方没有其他根引用,那么什么都不存在;但有了这样的语义学,这个问题就变得毫无意义了。这就像说如果没有计算机,我就无法运行Java应用程序。万岁,赢得了0美元的价格。因为Java真正分配内存的唯一时间是在创建对象时(对象和数组,但差别相同),这绝对正确,但不是很有用 更有用的是说明为什么这些对象是长寿命的 如果你正在写一篇论文或其他东西,我会描述导致对象被保留的对象树的“根” 这些措施包括:
- 堆栈上的临时变量(任何线程的)
- 静态变量(来自任何类)
- 来自JNI本机代码的特殊引用
我相信还有更多,我从他那里抄袭的医生感觉很老。我知道RMI可以保存未回收的引用(我想可能属于“JNI”项目)因为Java真正分配内存的唯一时间是在创建对象时(对象和数组,但相同的差异),这绝对正确,但不是很有用 更有用的是说明为什么这些对象是长寿命的 如果你正在写一篇论文或其他东西,我会描述导致对象被保留的对象树的“根” 这些措施包括:
- 堆栈上的临时变量(任何线程的)
- 静态变量(来自任何类)
- 来自JNI本机代码的特殊引用
我相信还有更多,我从他那里抄袭的医生感觉很老。我知道RMI可以保存未回收的引用(我想可能属于“JNI”项目)首先要确定的是:
- 对象是从其他对象引用的,整个正在运行的程序可以可视化为引用其他对象的对象图
- 根据定义,如果活动线程无法访问对象,则可以对其进行垃圾收集
- 有可能是有意或无意地创建一个应用程序,它会重复创建对象,然后再也不会让这些对象被垃圾收集。在一个长时间运行的程序中反复这么做,你会有明显的内存泄漏
实际上,如果说内存泄漏总是与一个“常规”长寿对象相关联的话,我认为这是错误的。但如上所述,仍然存在误导。首先要确定一些事情:
- 对象是从其他对象引用的,运行的程序的整体可以可视化为对象的图形