繁体   English   中英

Java中的类加载与对象创建

[英]Class Loading vs. Object creation in Java

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

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

非常感谢 !

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

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

  2. 该类需要初始化。

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

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

通常在第一次实际使用类之前立即进行类初始化。 (确切的细节在JLS中列出)。 这是将为类静态对象分配内存的时间。

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

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

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

我对将内存分配给Java程序的时间感到非常困惑

这是因为没有时间 内存分配和重新分配在Java程序的整个生命周期中持续发生。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM