Java – 空variables是否需要内存中的空间

class CheckStore { private String displayText; private boolean state; private String meaningfulText; private URL url; public CheckStore(String text, boolean state) { this.displayText = text; this.state = state; } : : } 

因为我在构造函数中只初始化了两个variables( displayTextstate ),剩下的两个variables( meaningfulTexturl的值将为null )将需要空间来存储null值。

Q1。 我认为他们将需要空间。 如果他们愿意,那么null值在内存中占用多less内存(如int需要4个字节)。

Q2。 一个string在内存中占用多less空间 我想这将取决于string的长度。 那么一个string需要多less空间?

在Java中, null只是一个引用(基本上是一个受限制的指针)可以拥有的值。 这意味着这个参考没有任何意义。 在这种情况下,您仍然占用参考空间。 这是32位系统上的4个字节或64位系统上的8个字节。 但是,除非实际分配该类的实例以指向引用,否则不会占用引用指向的类的任何空间。

编辑:就String ,Java中的String占用每个字符16位(2字节),加上less量的簿记开销,这可能是未logging的和实现特定的。

我想补充一点:

  1. 引用types的variables将被初始化为空值。
  2. null不是对象。 因为(null instanceof Object)等于false
  3. JVM中只有一个空值。 不pipe有多lessvariables引用null。

    Object s =(String)null;

    对象我=(整数)null;

    System.out.println(s == i); // true

你可以使用jol来获得该类的布局。 (但是要小心,您可能需要对其背后的机制有更深入的了解,不要盲目信任结果,并且意识到这只是对当前使用的VM的估计(在我的情况下为1.7.0_76 x64 win):

我使用的CLI版本我想正确的方法是将库包括在您的项目,但无论如何,它似乎这样工作:

 test>java -cp target\classes;jol-cli-0.3.1-full.jar org.openjdk.jol.Main internals test.CheckStore Running 64-bit HotSpot VM. Using compressed oop with 0-bit shift. Using compressed klass with 0-bit shift. Objects are 8 bytes aligned. Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] VM fails to invoke the default constructor, falling back to class-only introspection. test.CheckStore object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 12 (object header) N/A 12 1 boolean CheckStore.state N/A 13 3 (alignment/padding gap) N/A 16 4 String CheckStore.displayText N/A 20 4 String CheckStore.meaningfulText N/A 24 4 URL CheckStore.url N/A 28 4 (loss due to the next object alignment) Instance size: 32 bytes (estimated, the sample instance is not available) Space losses: 3 bytes internal + 4 bytes external = 7 bytes total 

和自动压缩的oops一样:

 test>java -XX:-UseCompressedOops -cp target\classes;jol-cli-0.3.1-full.jar org.openjdk.jol.Main internals test.CheckStore Running 64-bit HotSpot VM. Objects are 8 bytes aligned. Field sizes by type: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] Array element sizes: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] VM fails to invoke the default constructor, falling back to class-only introspection. test.CheckStore object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 16 (object header) N/A 16 1 boolean CheckStore.state N/A 17 7 (alignment/padding gap) N/A 24 8 String CheckStore.displayText N/A 32 8 String CheckStore.meaningfulText N/A 40 8 URL CheckStore.url N/A Instance size: 48 bytes (estimated, the sample instance is not available) Space losses: 7 bytes internal + 0 bytes external = 7 bytes total 

这些只是对象本身的布局,如果你的字段为空,那么它不会指向更多的对象,否则你也必须看目标types( URLString )。 (如果你有所有的多个实例,这取决于你使用相同的多次或不同的)。 空字段不能在内存中跳过,因为它将要求实例在分配时被resize。 所以这些字段都是预先构build好的,它们只是不会在堆上的其他地方引用分配的对象。

注意:如果你实现一个默认的构造函数,你会得到更多的细节,但是在这个特定情况下的大小是相同的。 如果你想知道字段的顺序和填充是从哪里来的,你可以查看这篇文章 – (基本上,它将8个字节的对象alignment,按大小对字段进行sorting,将相同types分组在一起,引用最后一个字段。 4个字节alignment。)