Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的类加载与对象创建_Java_Object_Classloader - Fatal编程技术网

Java中的类加载与对象创建

Java中的类加载与对象创建,java,object,classloader,Java,Object,Classloader,我对Java程序分配内存的时间感到非常困惑。加载类时是否“部分完成”?我已经阅读了要加载的类生命周期->链接->初始化->卸载。即使我们不创建该类的对象,这些进程中不会消耗一些内存吗 我也想知道初始化步骤是在类加载还是对象创建期间完成的 非常感谢 VM使用内存,然后VM中的Java对象使用内存。类加载器和对象占用内存,但当您使用“新”表达式构造类时,会为该类的特定实例分配内存。但是,确实存在一些小的、固定数量的开销内存,以便能够引用和实例化特定类型。Jvm将在您执行new时分配内存,除非您调用s

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

我也想知道初始化步骤是在类加载还是对象创建期间完成的


非常感谢

VM使用内存,然后VM中的Java对象使用内存。类加载器和对象占用内存,但当您使用“新”表达式构造类时,会为该类的特定实例分配内存。但是,确实存在一些小的、固定数量的开销内存,以便能够引用和实例化特定类型。

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

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

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

  • 该类需要初始化

  • 需要创建类的实例

  • 类的加载和链接通常在启动JVM时发生,尽管JVM可以“惰性地”完成,也可以动态完成;e、 g.使用
    Class.forName(…)
    。这是为类“代码”分配内存的时候

    类初始化通常在第一次实际使用该类之前立即完成。(具体细节见JLS)。此时将为类statics分配内存

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

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

    我当时很困惑 哪个内存分配给Java 节目


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

    您所说的“它还将创建类”是什么意思?请解释一下,这个答案有误导性。调用
    静态
    方法不会“创建”类。它甚至不一定会导致类初始化。(可能已经发生了。)类将被加载(由类加载器加载),我确信这就是他想要用“类创建”(与“实例创建”无关)来表达的意思。你能解释一下“类对象”包含什么吗?它们不包含简单对象之类的实例变量吗?@Raj,不。类的实例包含成员变量。类对象是“类”类型的实例,包含描述类的函数、字段等的元数据。(将其视为“.class”文件的编程表示)。