是首次调用静态方法时自动创建的类的实例
2022-09-03 01:26:30
我想知道如果你有一个只有静态方法的类,当你调用第一个静态方法时,这个类的实际实例是否会在某个地方创建?
在内存管理方面,这有点令人困惑,因为您从未实际调用构造函数或显式创建方法的实例。
如果确实创建了一个实例,我想更好地了解此实例的生存位置和持续时间。
我想知道如果你有一个只有静态方法的类,当你调用第一个静态方法时,这个类的实际实例是否会在某个地方创建?
在内存管理方面,这有点令人困惑,因为您从未实际调用构造函数或显式创建方法的实例。
如果确实创建了一个实例,我想更好地了解此实例的生存位置和持续时间。
说你有
static class Foo
{
static Bar bar = new Bar();
static int func(){ ... }
}
显然,不会创建用于调用 的对象。Foo
func()
但是,该类需要加载到内存中;对于应用程序,有一个与该类对应的对象,可以称为 、 或 。Foo
Foo.class
Class.forName("Foo")
装入的类尚未初始化。当您第一次调用静态方法时,该类被初始化;为静态变量分配一些“空间”,并执行静态初始值设定项代码(如)。new Bar()
这个“空间”作为一个对象对应用程序是不可见的;但它也是一个内存中的数据结构,涉及垃圾回收(以及它所指的其他对象,如bar
)
仅当加载类的类装入器符合 GC 条件时,类和“空间”才有资格获得 GC。对于通常的命令行应用程序,这永远不会发生。但对于许多其他应用程序,类GC很重要,类加载需要仔细完成。