Java中的类加载与对象创建

时间:2010-08-20 05:05:29

标签: java object classloader

我对将内存分配给Java程序的时间感到非常困惑。加载类时它是“部分完成的”吗?我已经阅读了要加载的类生命周期 - > linking-> initialization->卸载。即使我们不创建该类的对象,也不会在这些进程中消耗一些内存吗?

我也很想知道在类加载或对象创建过程中是否完成了初始化步骤?

非常感谢!

4 个答案:

答案 0 :(得分:7)

在你可以“使用”一个类的实例之前,有三件事需要发生,每个实例需要分配堆内存:

  1. 需要加载和链接类字节码以解决对其他类的任何静态依赖。

  2. 该课程需要初始化。

  3. 需要创建类的实例。

  4. 类的加载和链接通常在启动JVM时发生,尽管它可以由JVM“懒惰地”完成,并且可以动态完成;例如使用Class.forName(...)。这是分配“代码”类的内存时。

    类初始化通常在第一次实际使用类之前完成。 (具体细节见JLS)。这是在分配类静态的内存时。

    使用new构造时会发生类创建。这也将触发尚未初始化的类的类初始化。这是在分配实例的内存时。

    除了上述内容之外,在某些时候,JVM可以运行JIT编译器将类的字节码转换为本机代码。何时(以及确实如此)发生这种情况取决于JVM版本和JVM启动选项。 JIT编译当然会分配内存来保存类编译的本机代码。

答案 1 :(得分:1)

VM使用内存,然后VM中的Java对象使用内存。类加载器和Class对象占用内存,但是当使用“new”表达式构造类的特定实例时,将分配该类的内存。但是,有一些小的固定数量的开销内存可以引用和实例化特定类型。

答案 2 :(得分:0)

  

我对此非常困惑   哪个内存分配给Java   程序

那是因为没有 时间。内存分配和释放在Java程序的整个生命周期中不断发生。

答案 3 :(得分:-1)

Jvm会在您执行new时分配内存,除非您调用static方法,在这种情况下它也会创建类。