我想知道如果我有以下课程。
class Example {
public static void method1() {}
public void method2() {}
public void method3() {}
}
只有一个方法是静态的,它应该是在运行时在内存中加载的第一个方法。但实例方法呢?当创建此类的实例时,它们是否已加载到内存中?或者在最初加载类时它们已经加载了。
我想要了解的是,通过为每个功能提供单独的方法来获得同一类中的所有功能是一种更好的方法,还是更好地为每个功能创建一个单独的类,只有相应的方法它的班级。
因此,在后一种情况下,它将有助于内存,因为我只会创建需要使用的类的实例,并且只会在内存中加载那么多方法。否则,在前一种情况下,我在同一个类中有100个方法,但我只需要使用它们中的2个方法,因为所有100个方法都被加载,这将浪费内存。
有什么建议吗?
答案 0 :(得分:1)
实际上,类变量和类成员函数/方法的内存分配是以不同方式完成的。当一个类被实例化时,它的类变量在内存中创建,调用为data segment
,方法代码在code segment
中创建。如果我们创建特定类的十个对象,则Java虚拟机将创建十个不同的code segments
,但只会为所有对象创建一个code segment
。只有在代码中至少有一个类对象的引用时,Java虚拟机才会创建code segment
。
代码段仅捕获最小内存。它只存储从代码创建的汇编指令。因此,您无需担心它。对于对象,程序员也不必担心在Java中管理内存,因为java中有垃圾收集器。
现在在我的评论部分回答你的问题: -
但是方法本身是否会存储在堆等的某个地方?那么一个有100个方法或2个方法的类会表现出相同的记忆吗?
正如我所说,你的方法的代码将由你的java虚拟机转换为汇编指令,并将存储在每个方法的指令指针的内存中。现在不一定很多方法,它将取决于代码行,递归,循环和条件等。是的,如果100个具有相同大小的代码的方法具有上述所有,那么它将比两个方法占用更多的内存。