【发布时间】:2021-03-11 13:23:09
【问题描述】:
我知道静态变量存储在内存中的特定位置。每当您将对象声明为静态时,只要该类由类加载器加载,该对象就永远不会被 gc 回收.. 到目前为止一切顺利。
但是想象一下,我定义为静态的变量有一个内部非静态列表,所以即使对象本身永远不会被回收,该列表是否会正常回收?而且即使我为静态对象分配了一个新实例,旧值不会被回收吗?这个对象经过的所有值会不会占用内存空间?
【问题讨论】:
-
对列表的引用是
static使得没有区别。通常的规则适用:当旧列表变得无法访问时,它就是垃圾收集的候选对象。它可能在static引用被更改后仍然存在的唯一原因是如果其他东西持有对它的引用。 -
没有所谓的“静态对象”。与任何其他变量一样,
static变量只能保存对对象的 引用。这不会改变对象的性质。只有static final变量在类的整个生命周期中不可避免地引用同一个对象。
标签: java memory static garbage-collection jvm