Java 中的类加载与对象创建

问题描述 投票:0回答:4

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

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

非常感谢!

java object classloader
4个回答
8
投票

在“使用”类的实例之前需要完成三件事,每一件都需要分配堆内存:

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

  2. 该类需要初始化。

  3. 需要创建该类的实例。

类的加载和链接通常在启动 JVM 时发生,尽管它可以由 JVM“延迟”完成,也可以动态完成;例如使用

Class.forName(...)
。这是为类“代码”分配内存的时候。

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

类创建在使用

new
构造时发生。这也会触发尚未初始化的类的类初始化。这是为实例分配内存的时间。

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


1
投票

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


0
投票

这段时间我很困惑 哪些内存分配给了Java 节目

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


-1
投票

Jvm 将在您执行

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

© www.soinside.com 2019 - 2024. All rights reserved.