Java中是否为未使用的字段分配内存?

3

我想知道Java中的内存分配是如何工作的。

我有一个名为Duck的类,其中包含两个实例变量int sizeString name。这些变量被初始化。如果我没有实例化这个类,那么这些变量的内存会在运行时分配到堆上吗?

谢谢, Gene

2个回答

7

几种可能的情况:

  • 如果您没有使用一个类,那么该类本身根本没有在类加载器中加载。

  • 如果您正在使用一个类,但是没有实例化它,那么实例变量不会占用内存,因为没有实例可用。

  • 如果您正在使用一个类,并且使用该类的对象作为实例,则每个实例的实例变量都会占用内存,无论您是否使用这些值。


嗨Goran,谢谢回复。我该如何在不实例化类的情况下使用它? - Gene
类中的静态字段?在类的锁上同步? - Jan Zyka
挑剔一点:JVM(特别是JIT编译器)可能会注意到您实际上并没有使用这些变量并将其优化掉。但这并不是保证的... - sleske
@sleske: 就像你所说的那样!它可能发生,但不一定会发生。因此,最安全(最坏的情况)的假设是它不会发生。另外,也许更难注意到字段未使用,而不是局部变量。 - Goran Jovic

6

如果你根本没有引用 Duck 类,那么这个类甚至不会被类加载器加载,所以答案是否定的。


所以,如果这是一个公共类,在他的程序中没有使用,但可能从其他应用程序中使用,那么只有在创建该类的实例时才分配内存? - James Raitsev
不涉及实例。当您首次引用类时(无需在此处创建实例),JVM会加载您的类。因此,如果您在jar包中有Duck类,并且从未在应用程序中引用过它,则不会被加载。 - Jan Zyka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接