【发布时间】:2010-09-22 20:27:12
【问题描述】:
当我调用静态方法时:
Something.action();
由于没有创建实例,静态方法的 Class 将在内存中保留多长时间?
如果我调用相同的方法,由于不存在实例,每次调用都会重新加载类吗?
是在调用时只加载单个静态方法,还是一个类的所有方法和静态方法都加载到内存中,即使可能只使用一个静态方法?
【问题讨论】:
当我调用静态方法时:
Something.action();
由于没有创建实例,静态方法的 Class 将在内存中保留多长时间?
如果我调用相同的方法,由于不存在实例,每次调用都会重新加载类吗?
是在调用时只加载单个静态方法,还是一个类的所有方法和静态方法都加载到内存中,即使可能只使用一个静态方法?
【问题讨论】:
除非您配置了 permgenspace 的垃圾回收,否则该类将保留在内存中,直到 vm 退出。整个类加载了所有静态方法。
【讨论】:
该类一直保留在内存中,直到加载该类的类加载器保留在内存中。因此,如果该类是从系统类加载器加载的,则据我所知,该类永远不会被卸载。
如果你想卸载一个类,你需要:
【讨论】:
在某些配置中,该类甚至在您进行调用之前就已加载。我们使用了 BES(Borland Enterprise Server),但我们的 Solaris 生产服务器存在问题,其中所有引用的类在我们的应用程序启动时递归加载。这意味着,当我们的应用程序的主类被加载时,应用程序服务器会以递归方式加载该类的导入部分中引用的所有类。
附带说明,除非您在内存非常受限的环境中运行,或者如果您正在加载大量不必要的类,您不应该太在意内存中加载的类的内存使用情况。
【讨论】:
Something 类应该在调用者类被加载时被加载。正如 krosenvold 所说,它会一直留在那里直到 VM 退出。
【讨论】: