【问题标题】:Does a static field outlive the containing instance? Is this a memory leak?静态字段是否比包含实例的寿命更长?这是内存泄漏吗?
【发布时间】:2016-04-17 15:41:11
【问题描述】:

我正在使用库作为我的应用程序的一部分。
我正在实例化一个从该库导入的类。例如。 Calculator c = new Calculator() 并使用实例。
Calculator 类有一个静态成员字段,它是一个哈希映射 internalMap,具有对对象的强引用。我指的是键/值对。
因此,当我使用实例 c 时,这个静态 internalMap 正在被填充(通过这个库的内部逻辑而不是我的代码)。
我不确定的是这个静态哈希图是否比实例寿命更长。
我认为如果c 被GCed,则静态internalMap 不会被GCed,因为它是静态的。
所以本质上这种记忆正在“丢失”?即内存泄漏?

【问题讨论】:

    标签: java performance memory-management memory-leaks garbage-collection


    【解决方案1】:

    简短的回答是肯定的。如果要回收该内存,则必须清理所有静态数据。也许图书馆的作者已经提供了一些处理方法?

    【讨论】:

    • 否,该类不暴露给客户端代码。因此,如果哈希映射具有弱引用的键/值,就不会有问题吗?此外,即使键/值仅由 hashmap 引用,它们也会永久保留,因为 hashmap 未经过 GC 处理,对吗?
    • 我更多地考虑图书馆提供的一些清理混乱的方法。无论如何,我猜弱引用不会成为问题,只是地图本身仍然存在。是的,地图中引用的所有内容都将保留。
    【解决方案2】:

    据我所知,GC(垃圾收集器)查看堆内存并确定哪些对象正在使用(哪些没有)...删除未使用的对象。如果一个对象正在被使用/引用,这意味着“某人”仍然维护着一个指向它的指针。另一方面,一个不再被引用的未使用/未引用的对象,它准备释放 GC 运行时使用的内存。

    基于此,对于您的Calculator 类,只要您在internalMap 中有引用并且GC 运行,它就不会被释放......根本。所以这并不是说“它比实例寿命长”,实例将在那里直到它被 GC'ed,但因为它仍然有一个(或更多)成员具有一些“活动”引用,所以它不能被 GC'ed (因此,它所占用的内存不能被重用/释放)。

    如果我错了,请纠正我......

    【讨论】:

      猜你喜欢
      • 2013-03-22
      • 1970-01-01
      • 2011-02-20
      • 2013-08-12
      • 2013-01-08
      • 2013-11-12
      • 2015-05-04
      相关资源
      最近更新 更多