有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:`static`方法

当我调用静态方法时,比如:

Something.action();

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

如果我调用相同的方法,由于不存在实例,是否会为每次调用重新加载该类

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


共 (4) 个答案

  1. # 1 楼答案

    调用方类加载时,应该加载Something类。正如克罗森沃尔德所说,它会一直留在那里,直到虚拟机退出

  2. # 2 楼答案

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

  3. # 3 楼答案

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

    作为补充说明,除非您运行在一个非常内存受限的环境中,或者如果您正在加载大量不必要的类,否则您不应该太在意在内存中加载的类的内存使用情况

  4. # 4 楼答案

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

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

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