字符串在Java 8中使用了多少内存?

时间:2015-07-03 12:26:25

标签: java string memory

我最近阅读了很多关于字符串内存分配的内容,如果与Java 8的内容相同,则无法找到任何详细信息。

Java 8中的"Alexandru Tanasescu"之类的字符串会占用多少内存空间? 我使用64位版本。

4 个答案:

答案 0 :(得分:29)

Java7或更低版​​本

最小字符串内存使用量:

(bytes) = 8 * (int) ((((no chars) * 2) + 45) / 8)

所以

80 = 8 * (int) ((((19) * 2) + 45) / 8)

了解字符串内存使用情况SOURCE

  

要理解上面的计算,我们需要从查看String对象上的字段开始。 String包含以下内容:

     
      
  • 一个char数组 - 因此是一个单独的对象 - 包含实际的字符;
  •   
  • 字符串开始的数组中的整数偏移量;
  •   
  • 字符串的长度;
  •   
  • 另一个用于缓存计算哈希码的int。
  •   
     

这意味着即使字符串不包含字符,它也需要4个字节用于char数组引用,加上3 * 4 = 12个字节用于三个int字段,再加上8个字节的对象头。这给出了24个字节(这是8的倍数,因此到目前为止还没有"填充"字节)。

     

然后,(空)char数组将需要另外12个字节(数组有额外的4个字节来存储它们的长度),再加上4个字节的填充,以使char数组对象使用的内存达到16的倍数。总的来说,空字符串使用40个字节。

如果String包含19个字符,那么String对象本身仍然需要24个字节。但是现在char数组需要12个字节的标头加上19 * 2 = 38个字节用于17个字符。由于12 + 38 = 50不是8的倍数,我们还需要向上舍入到8(56)的下一个倍数。总的来说,我们的19个字符String将耗尽56 + 24 = 80个字节。

Java8。

  

Java 8不再具有offsetlength。仅限hashCharArray@Thomas Jungblut

  • 一个char数组 - 因此是一个单独的对象 - 包含实际的字符;
  • 字符串开始的数组中的整数偏移量;
  • 字符串的长度;
  • 另一个用于缓存计算哈希码的int。

因此,在Java8中,为字符串计算内存的方法保持不变,但由于缺少offsetlength,因此必须减少8个字节。

答案 1 :(得分:5)

如果查看Oracle Java 8源代码,您可以:

char value[]int hashchar是2个字节,int是4个字节。

所以答案不是yourstring.length * 2 + 4?

没有。每个对象都有开销。例如,数组存储其尺寸。数组(对象)和字符串都会从垃圾收集器中产生额外的内存,存储有关它们的信息。

没有可靠的方法来计算这个,因为AFAIK每个JRE和JDK都没有义务对象开销的大小。

答案 2 :(得分:4)

" Alexandru Tanasescu"使用104个字节。这是如何获得大小

    long m0 = Runtime.getRuntime().freeMemory();
    String s = new String("Alexandru Tanasescu");
    long m1 = Runtime.getRuntime().freeMemory();
    System.out.println(m0 - m1);

注意:使用-XX运行它:-UseTLAB选项

答案 3 :(得分:0)

根据以下JEP: http://openjdk.java.net/jeps/254

  

String类的当前实现将字符存储在a中   char数组,每个字符使用两个字节(16位)。

在Java SE 9中,这可能会改变。

但是请注意,因为这是一个JEP而不是JSR(它提到了实现),我理解,这是特定于实现的,而不是由JLS定义的。