静态列表中的对象是否符合垃圾回收条件?
Are objects inside a static list eligible for garbage collection?
我知道只要加载了 class,静态变量就没有资格进行垃圾回收,但我想知道它的对象内容是否也是这种情况。我有这个静态列表,其中包含一个 class 对象引用。如果没有人引用“someObject”,它们是否符合垃圾回收条件?
private static List<SomeObject> mylist = new ArrayList<>();
I was wondering if that is the same case for it's object contents.
是的,对象的内容也是一样的。以及它们的内容。以及它们的内容……等等。
如果您的应用程序的某些部分可以在将来的某个时间点尝试访问某个对象,则该对象是可访问的。
或者另一种表达方式(在实践中1)是,如果有一个 path 到它的对象是可达的引用链,从 GC 根开始。静态变量是 GC 根,线程栈也是。
Are "someObject" eligible for garbage collection if no one's referencing them?
如果一个对象在列表中,它被列表引用。如果列表可访问,则其内容也是可访问的。
1 - 理论上,编译器 可以 确定当对象存在路径时,实际上永远不会遵循该路径。但是,这需要编译器进行一些困难/昂贵的分析。所以这是一种通常不会尝试的优化方法,除非在有限的情况下;例如当不再使用范围内的变量时。
我知道只要加载了 class,静态变量就没有资格进行垃圾回收,但我想知道它的对象内容是否也是这种情况。我有这个静态列表,其中包含一个 class 对象引用。如果没有人引用“someObject”,它们是否符合垃圾回收条件?
private static List<SomeObject> mylist = new ArrayList<>();
I was wondering if that is the same case for it's object contents.
是的,对象的内容也是一样的。以及它们的内容。以及它们的内容……等等。
如果您的应用程序的某些部分可以在将来的某个时间点尝试访问某个对象,则该对象是可访问的。
或者另一种表达方式(在实践中1)是,如果有一个 path 到它的对象是可达的引用链,从 GC 根开始。静态变量是 GC 根,线程栈也是。
Are "someObject" eligible for garbage collection if no one's referencing them?
如果一个对象在列表中,它被列表引用。如果列表可访问,则其内容也是可访问的。
1 - 理论上,编译器 可以 确定当对象存在路径时,实际上永远不会遵循该路径。但是,这需要编译器进行一些困难/昂贵的分析。所以这是一种通常不会尝试的优化方法,除非在有限的情况下;例如当不再使用范围内的变量时。