【问题标题】:Java: When are instance methods loaded in memory?Java:实例方法何时加载到内存中?
【发布时间】:2018-03-14 16:43:04
【问题描述】:

如果我有以下课程,我想知道。

class Example {

public static void method1() {}

public void method2() {}

public void method3() {}
}

只有一种方法是静态的,它应该是运行时首先加载到内存中的方法。但是实例方法呢?当创建此类的实例时,它们是否加载到内存中?还是它们在最初加载类时已经加载。

我想了解的是,通过为每个功能设置单独的方法,将所有功能放在同一个类中是否是一种更好的方法,或者最好为每个功能创建一个单独的类,只使用相应的方法它的类。

所以在后一种情况下它是否有助于内存,因为我只会创建我需要使用的类的实例,并且只有这么多的方法会加载到内存中。否则,在前一种情况下,我在同一个类中有 100 个方法,但我只需要使用其中的 2 个方法,这将浪费内存,因为所有 100 个方法都已加载。

有什么建议吗?

【问题讨论】:

    标签: java memory static instance


    【解决方案1】:

    实际上,类变量和类成员函数/方法的内存分配是不同的。当一个类被实例化时,它的类变量被创建在内存中,调用为data segment,方法代码在code segment中创建。如果我们创建一个特定类的十个对象,java 虚拟机将创建十个不同的code segments,但只会为所有对象创建一个code segment。仅当代码中至少有一个对该类对象的引用时,Java 虚拟机才会创建 code segment,否则不会。

    代码段只占用最少的内存。它只存储从代码创建的汇编指令。因此,您无需担心。对于对象,程序员也无需担心在 Java 中管理内存,因为 Java 中有一个垃圾收集器。

    现在在我的评论部分回答你的问题:-

    但是方法本身会存储在堆等的某个地方吗?那么一个有 100 个方法或 2 个方法的类会在内存方面表现相同吗?

    正如我所说,您的方法代码将由您的 java 虚拟机转换为汇编指令,并将存储在内存中每个方法的指令指针中。现在不一定有很多方法,它取决于代码行数、递归、循环和条件等。是的,如果 100 个相同大小的方法与上述所有方法相比,它会比两种方法占用更多的内存。

    【讨论】:

    • 嗨阿比吉特,感谢您的回复。我能理解你在说什么。我知道方法中的变量只会在调用该方法时消耗内存。但是方法本身会存储在堆等的某个地方吗?那么一个有 100 个方法或 2 个方法的类会表现出相同的内存消耗吗?
    • @Manpreet,请查看我修改后的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 2014-06-30
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多