当我调用静态方法时:
Something.action();
由于没有创建实例,静态方法的类将在内存中保存多长时间?
如果我调用相同的方法,是否会为每个调用重新加载类,因为不存在实例?
并且在调用时是否仅加载单个静态方法,或者即使只使用一个静态方法,一个类的所有方法和静态方法是否都加载到内存中?
除非您配置了 permgenspace 的垃圾收集,否则该类将保留在内存中,直到 vm 退出。整个类加载了所有静态方法。
该类一直保留在内存中,直到加载该类的类加载器保留在内存中。因此,如果该类是从系统类加载器加载的,则据我所知,该类永远不会被卸载。
如果你想卸载一个类,你需要:
在某些配置中,甚至在您进行调用之前就已加载该类。我们使用了 BES(Borland Enterprise Server),但我们的 Solaris 生产服务器存在问题,其中所有引用的类在我们的应用程序启动时递归加载。这意味着,当我们的应用程序的主类被加载时,应用程序服务器会加载该类的导入部分中引用的所有类......递归。
作为旁注,除非您在非常内存限制的环境中运行,或者如果您正在加载大量不必要的类,您不应该太关心加载到内存中的类的内存使用情况。
加载调用者类时应该加载Something类。正如 krosenvold 所说,它一直存在直到 VM 退出。