When and how are classes garbage collected in Java?(Java 中何时以及如何收集类垃圾?)
问题描述
我在这个主题.但我得到的答案,给了我另一个问题.
有人提到垃圾收集器也可以收集类.这是真的?
如果这是真的,这是怎么回事?
Java 中的类可以在没有任何引用的情况下被垃圾回收.在大多数简单的设置中,这永远不会发生,但在某些情况下可能会发生.
有很多方法可以使类可访问,从而阻止它符合 GC 条件:
- 该类的对象仍然可以访问.
- 表示该类的
Class
对象仍然可以访问 - 加载该类的
ClassLoader
仍然可以访问 ClassLoader
加载的其他类仍然可以访问
当 none 为真时,ClassLoader
及其加载的所有类都符合 GC 条件.
这是一个构建的示例(充满了不良做法!),应该展示这种行为:
在目录(不是包!)x
中创建一个字节码文件GCTester.class
.它的源代码是:
在倒数第二行中,我们看到 GCTester
实例已完成,这仅意味着该类(和 ClassLoader
)符合垃圾回收条件.
I asked a question about Garbage Collection in Java in this topic. But the answer I got, gave me another question.
Someone mentioned that classes can be collected by the garbage collector too. Is this true?
And if it is true, how does this work?
A class in Java can be garbage-collected when nothing references it. In most simple setups this never happens, but there are situations where it can occur.
There are many ways to make a class reachable and thus prevent it from being eligible for GC:
- objects of that class are still reachable.
- the
Class
object representing the class is still reachable - the
ClassLoader
that loaded the class is still reachable - other classes loaded by the
ClassLoader
are still reachable
When none of those are true, then the ClassLoader
and all classes it loaded are eligible for GC.
Here's a constructed example (full of bad practices!) that should demonstrate the behaviour:
Create a bytecode file GCTester.class
in a directory (not package!) x
. It's source code is:
Then create a class TestMe
in the parent directory of x
:
Running TestMe
will produce this (or similar) output:
in main Creating ClassLoader Loading Class Getting static field Reading static value GCTester@1feed786 created Got value: GCTester@1feed786 First gc() call Second gc() call (in main) GCTester@1feed786 finalized End of main
In the second to last line we see that the GCTester
instance is finalized, which can only mean that the class (and ClassLoader
) are eligible for garbage collection.
这篇关于Java 中何时以及如何收集类垃圾?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!