【问题标题】:Java: `static` MethodsJava:`静态`方法
【发布时间】:2010-09-22 20:27:12
【问题描述】:

当我调用静态方法时:

Something.action();

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

如果我调用相同的方法,由于不存在实例,每次调用都会重新加载类吗?

是在调用时只加载单个静态方法,还是一个类的所有方法和静态方法都加载到内存中,即使可能只使用一个静态方法?

【问题讨论】:

    标签: java static methods


    【解决方案1】:

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

    【讨论】:

    • 严格来说这不是真的,尽管它是一个合理的类加载心智模型。一些 VM 会动态卸载未使用的类,以减少常驻内存大小;然而,这样的优化只会在运行时间很长的进程中发挥作用,并且只能在实现它的虚拟机上发挥作用。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      附带说明,除非您在内存非常受限的环境中运行,或者如果您正在加载大量不必要的类,您不应该太在意内存中加载的类的内存使用情况。

      【讨论】:

      • 在“过早”加载引用的类时遇到了哪些问题?我很好奇会出现什么样的问题。
      • 问题是我们在服务器和客户端上运行相同的库。某些代码路径不会在服务器上采用,因此我们尝试删除不会调用的不必要的库。即使不调用代码,应用也会在启动时崩溃。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-14
        • 2019-07-06
        • 2013-04-11
        • 2010-12-22
        相关资源
        最近更新 更多