如answers to my SO question here中所述,permgen
空格具有方法的字节码。
java类的所有内容是什么?它的 fields 或方法(也是构造函数)。而方法构成了代码的主要部分。
我真的很困惑,为什么几乎完整的.class
文件(字节码)被加载到JVM的内存中(如果这是真的)。
请有人澄清一下吗?
答案 0 :(得分:0)
JVM将整个类加载到内存中,因为它构成了一个可执行单元。在本机世界中,加载整个可执行文件(例如.exe),或者将整个动态库(.dll,.so,.dynlib)作为单个单元加载到内存中。与此相比,Java实际上更有效率,因为只加载了由另一个执行类直接引用的类。
例如:
class A {
public A() {
}
}
class B {
public void method1() {
// do something
}
public void method2() {
A a = new A();
}
}
即使加载了B类,即使B类引用了A类,JVM也不会加载A类。 如果调用 B.method2()
,则仅在此时JVM解析A类。
加载一个类后,“卸载”它的唯一方法是丢弃执行加载的ClassLoader。但即便如此,这在运行时提供的灵活性远远超过许多其他语言和运行时提供的灵活性。