【问题标题】:Does all values which a static object went through take up space in memory while class is loaded?加载类时,静态对象经历的所有值是否占用内存空间?
【发布时间】:2021-03-11 13:23:09
【问题描述】:

我知道静态变量存储在内存中的特定位置。每当您将对象声明为静态时,只要该类由类加载器加载,该对象就永远不会被 gc 回收.. 到目前为止一切顺利。

但是想象一下,我定义为静态的变量有一个内部非静态列表,所以即使对象本身永远不会被回收,该列表是否会正常回收?而且即使我为静态对象分配了一个新实例,旧值不会被回收吗?这个对象经过的所有值会不会占用内存空间?

【问题讨论】:

  • 对列表的引用是static 使得没有区别。通常的规则适用:当旧列表变得无法访问时,它就是垃圾收集的候选对象。它可能static 引用被更改后仍然存在的唯一原因是如果其他东西持有对它的引用。
  • 没有所谓的“静态对象”。与任何其他变量一样,static 变量只能保存对对象的 引用。这不会改变对象的性质。只有 static final 变量在类的整个生命周期中不可避免地引用同一个对象。

标签: java memory static garbage-collection jvm


【解决方案1】:

垃圾收集器从gc roots 开始扫描,其中一个根是static 字段。

所以GC 将遍历从该根“开始”的所有条目,例如:

   SomeStaticInstance
          |
         \ /
     NonStaticList

如果NonStaticList 是可访问的(gc 阶段的marking 阶段负责处理此问题),则认为它是活动的,因此不符合GC 的条件。如果无法访问,则有资格收集。请注意,如果它不可达,mark phase 甚至不会遍历任何可能有引用来自 NonStaticList

 NonStaticList
       |
      \ /
    RefHere

所以RefHere 不会被扫描。它可能会被扫描,如果它有来自其他地方的引用,但不是来自NonStaticList

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2012-10-30
    • 2018-02-26
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多