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( displayText
和state
),剩下的两个variables( meaningfulText
和url
的值将为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的和实现特定的。
我想补充一点:
- 引用types的variables将被初始化为空值。
- null不是对象。 因为(null instanceof Object)等于false
-
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( URL
和String
)。 (如果你有所有的多个实例,这取决于你使用相同的多次或不同的)。 空字段不能在内存中跳过,因为它将要求实例在分配时被resize。 所以这些字段都是预先构build好的,它们只是不会在堆上的其他地方引用分配的对象。
注意:如果你实现一个默认的构造函数,你会得到更多的细节,但是在这个特定情况下的大小是相同的。 如果你想知道字段的顺序和填充是从哪里来的,你可以查看这篇文章 – (基本上,它将8个字节的对象alignment,按大小对字段进行sorting,将相同types分组在一起,引用最后一个字段。 4个字节alignment。)