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

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

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

慕容3067478 2019-04-19 13:15:03
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具有该值的变量null)是否需要内存空间来存储null值。Q1。我认为他们需要空间。如果他们愿意,那么一个null值在内存中占用多少内存(比如int需要4个字节)。Q2。字符串在内存中占用多少空间。我想这将取决于字符串的长度。那么一个字符串需要多长的空间?
查看完整描述

4 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2019-05-15
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

我想补充一下:

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

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

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

    Object s =(String)null;

    对象i =(整数)null;

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


查看完整回答
反对 回复 2019-05-15
?
喵喵时光机

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

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

我使用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

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

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

查看完整回答
反对 回复 2019-05-15
?
当年话下

TA贡献1890条经验 获得超9个赞

Null表示0.在内存中通常有一个null定义。每当使用编程语言指向它时。一切都指向同一个地方。这意味着NULL只消耗了一个4字节的内存。然后无论什么指向它都不会消耗更多的内存。NULL的定义是特定于语言的,但定义为void * ptr = 0; 在C和C ++中很常见。JAVA必须以类似的方式定义它。不可能指向任何东西。你必须指出一些事情。但我们定义了一个共同的东西,一切都指向它只消耗那个空间。


查看完整回答
反对 回复 2019-05-15
  • 4 回答
  • 0 关注
  • 1638 浏览

添加回答

举报

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