为了账号安全,请及时绑定邮箱和手机立即绑定

Java-空变量是否需要内存空间

Java-空变量是否需要内存空间

海绵宝宝撒 2019-11-14 09:51:40
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;    }    :    :}当我在构造函数中仅初始化两个变量(displayText和state)时,其余两个变量(meaningfulText和url将具有value null)是否将需要内存中的空间来存储null值。Q1。我认为他们将需要空间。如果他们愿意,那么null值将占用多少内存(例如int占用4个字节)。Q2。字符串在内存中占用多少空间。我想这将取决于字符串的长度。那么,一个字符串要占用多少空间,长度又要多少?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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

编辑:就String而言,StringJava中的a 每个字符占用16位(2字节),加上少量簿记开销,这可能是未记录的且特定于实现的。


查看完整回答
反对 回复 2019-11-14
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

我想补充:

  1. 引用类型的变量将被初始化为空值。

  2. null不是对象。因为(null instanceof Object)等于false

  3. JVM中只有一个空值。无论有多少个变量引用null。

    对象s =(String)null;

    对象i =(整数)null;

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


查看完整回答
反对 回复 2019-11-14
?
三国纷争

TA贡献1804条经验 获得超7个赞

您可以使用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

如果您的字段为null,那么这些只是对象本身的布局,那么它将不会指向更多对象,否则您还必须查看目标类型(URL和String)。(并且,如果您拥有所有这些实例的多个实例,则取决于您使用相同的多次还是不同的实例)。空字段不能在内存中跳过,因为分配实例时需要调整实例的大小。所以这些字段都是预先构造的,它们只是不引用堆上其他地方分配的对象。


注意:如果实现默认的构造函数,则会获得更多详细信息,但是在这种情况下的大小将是相同的。如果您想知道字段的顺序和填充的来源,可以查看这篇文章 -(基本上,它将对象对齐8个字节,按大小对字段进行排序,将相同类型分组在一起,最后引用。来自超级类型的字段排在最前面, 4个字节对齐。)


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 510 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信