5

当我调用静态方法时:

Something.action();

由于没有创建实例,静态方法的类将在内存中保存多长时间?

如果我调用相同的方法,是否会为每个调用重新加载类,因为不存在实例?

并且在调用时是否仅加载单个静态方法,或者即使只使用一个静态方法,一个类的所有方法和静态方法是否都加载到内存中?

4

4 回答 4

11

除非您配置了 permgenspace 的垃圾收集,否则该类将保留在内存中,直到 vm 退出。整个类加载了所有静态方法。

于 2008-11-18T12:30:31.600 回答
4

该类一直保留在内存中,直到加载该类的类加载器保留在内存中。因此,如果该类是从系统类加载器加载的,则据我所知,该类永远不会被卸载。

如果你想卸载一个类,你需要:

  1. 使用自定义类加载器加载类和引用该类的所有类
  2. 完成该类后,释放对该类的所有引用 - 即确保周围没有该类的对象实例
  3. 通过释放加载这些类的自定义类加载器实例来卸载类和所有引用它的类。
于 2008-11-18T12:35:23.090 回答
2

在某些配置中,甚至在您进行调用之前就已加载该类。我们使用了 BES(Borland Enterprise Server),但我们的 Solaris 生产服务器存在问题,其中所有引用的类在我们的应用程序启动时递归加载。这意味着,当我们的应用程序的主类被加载时,应用程序服务器会加载该类的导入部分中引用的所有类......递归。

作为旁注,除非您在非常内存限制的环境中运行,或者如果您正在加载大量不必要的类,您不应该太关心加载到内存中的类的内存使用情况。

于 2008-11-18T12:46:03.097 回答
1

加载调用者类时应该加载Something类。正如 krosenvold 所说,它一直存在直到 VM 退出。

于 2008-11-18T12:35:32.497 回答