Java 内存泄漏总是需要一个长寿命的对象吗?

Java 内存泄漏总是需要一个长寿命的对象吗?,java,memory-leaks,Java,Memory Leaks,这句话是真是假,还是表述不当: “在Java中,内存泄漏必须始终与长寿命对象相关。” 在本文中,我只是指常规对象,而不是一般的系统资源(文件描述符等) 长寿对象的一个例子可能是单例对象(不管怎样,通常是实现的),它的寿命与应用程序运行的时间一样长 误导 虽然这句话在技术上是正确的,但内存泄漏是由比预期寿命更长的对象造成的。具有误导性 虽然该语句在技术上是正确的,但内存泄漏是由比预期寿命更长的对象引起的。该语句是正确的,但其格式很差。当不再需要对象后,对象仍被引用,导致内存泄漏 我能想到的内存泄漏

这句话是真是假,还是表述不当:

“在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”项目)

首先要确定的是:

  • 对象是从其他对象引用的,整个正在运行的程序可以可视化为引用其他对象的对象图
  • 根据定义,如果活动线程无法访问对象,则可以对其进行垃圾收集
  • 有可能是有意或无意地创建一个应用程序,它会重复创建对象,然后再也不会让这些对象被垃圾收集。在一个长时间运行的程序中反复这么做,你会有明显的内存泄漏
对于“长时间运行”、“明显”和“重复”,您可能有不同的值,但我们的想法是,内存泄漏是最后一点。因此,如果说内存泄漏与长寿命对象相关,那么我认为这是误导性的——对象占用内存,因此它们当然与某种类型的对象相关,但原因在于应用程序设计,而不是对象引用层次结构或垃圾回收器行为


实际上,如果说内存泄漏总是与一个“常规”长寿对象相关联的话,我认为这是错误的。但如上所述,仍然存在误导。

首先要确定一些事情:

  • 对象是从其他对象引用的,运行的程序的整体可以可视化为对象的图形