【问题标题】:Static methods loading/unloading and memory area in java?java中的静态方法加载/卸载和内存区域?
【发布时间】:2015-09-12 12:32:32
【问题描述】:

关于java中的静态方法我有四个问题:

1) 静态方法何时加载到内存中? 何时加载类或第一次调用方法?

2) 何时从内存中卸载静态方法? 何时卸载类或调用后该方法的执行流程结束?

3) JVM 静态方法的内存区域加载在哪个内存区域? 在堆栈内存区域或 JVM 中有不同类型的内存可用于静态方法(我也读过一些静态内存) ?

4) 在我们的应用程序中有这么多静态方法是不是很好?

我在这个网站和其他网站上遇到了很多问题,但他们没有明确说明。

【问题讨论】:

    标签: java memory-management static-methods


    【解决方案1】:

    1) 静态方法何时加载到内存中?什么时候加载类或者什么时候第一次调用方法?

    当类加载器加载特定类时。

    2) 静态方法何时从内存中卸载?当类卸载或调用后该方法的执行流程结束时?

    当 JVM 垃圾收集加载静态类的特定类加载器时。

    3) JVM 静态方法加载在哪个内存区域?在堆栈内存区域或 JVM 中有不同类型的内存可用于静态方法(我也读过一些静态内存)?

    通常在 Pergemen 空间中。

    where is a static method and a static variable stored in java. In heap or in stack memory

    4) 在我们的应用程序中有这么多静态方法是不是很好?

    是的,当他们单独解决目标时。

    【讨论】:

    • 我不太确定第 4 点,拥有全局状态绝不是一个好主意。如果可以避免,请避免。
    【解决方案2】:
    • 方法只是字节码,因此在加载类时会加载它,但这不特定于静态方法,成员方法会同时加载
    • 卸载类时。但这非常罕见:Unloading classes in java?
    • 类存储在堆中,在 PermGen 空间中(不是 GCed)
    • 视情况而定。如果它是用于语法糖或工厂方法,那很好。如果它是为了实现可以通过无状态和可序列化对象实现的功能,那也很可能没问题。如果要从代码中无法访问的地方访问某些属性或逻辑,那就错了。

    【讨论】:

      【解决方案3】:

      1) 静态方法何时加载到内存中?什么时候加载类或者什么时候第一次调用方法?

      ans) 类加载时

      2) 静态方法何时从内存中卸载?当类卸载或调用后该方法的执行流程结束时?

      ans) 静态方法在类被 ClassLoader 加载时被加载,并在卸载时被移除

      3)JVM静态方法加载在哪个内存区域?在堆栈内存区域或 JVM 中有不同类型的内存可用于静态方法(我也读过一些静态内存)?

      ans)在 Java 虚拟机实例中,有关加载类型的信息存储在称为方法区域的内存逻辑区域中。当 Java 虚拟机加载一个类型时,它使用类加载器来定位适当的类文件。类加载器读取类文件——二进制数据的线性流——并将其传递给虚拟机。虚拟机从二进制数据中提取有关类型的信息,并将信息存储在方法区中。类中声明的类(静态)变量的内存也取自方法区。

      4)在我们的应用程序中有这么多静态方法是不是很好?

      ans)一个经验法则:问问自己“即使还没有构建 Obj,调用这个方法是否有意义?”如果是这样,它肯定应该是静态的。

      【讨论】:

        猜你喜欢
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        • 2012-01-02
        • 2014-01-04
        • 1970-01-01
        相关资源
        最近更新 更多