Java字符串数组的内存使用情况

时间:2012-01-17 12:34:00

标签: java data-storage arrays

java字符串数组占用多少空间? 更具体地说,字符串数组看起来像这样的空间(以字节为单位):

Longbowman 
kingdom   
lord    
weapon1,weapon2,weapon3    
armor1,armor2,armor3

我问这个是因为我要创建一个包含5,000多个这些数组的程序,并想知道它将占用多少空间,所以我知道是否应该重做数据存储。

总结一下,字符串数组(如果可量化的话)占用了多少空间?

5 个答案:

答案 0 :(得分:16)

字符串 array 只是一个引用数组 - 大小为N的数组将占用大约(N * 4 + 20)或(N * 8 + 20)个字节,具体取决于a的大小JVM中的引用。

如果您对总存储空间感兴趣,那么您应该计算出已经有多少个独立的String对象, 你有多少个数组。如果你有5000个数组,但它们大多包含对相同几个字符串的引用,那么它很可能会很好。如果你有5000个数组,每个数组包含5个字符串,这些字符串在其他任何地方都没有使用,那就是25,000个字符串...它们可能不是很多(长度为20的字符串可能需要大约60个字节)。 / p>

当然,上下文在这里很重要:你的代码会运行什么?如果它在桌面PC上运行,那么可能不会出现问题......它可能可能在手机上出现问题。

答案 1 :(得分:1)

字符串数组可以随意使用吗?您定义String数组的大小。 String [] abc = new String [80]。 但我想你已经知道了......也许我没有得到你的问题。

1个字符= 2个字节而不是4个字节,因为Java使用16位unicode - 这是你要找的吗?

Integer.MAX_VALUE还是可用堆?可能是最大尺寸?

答案 2 :(得分:1)

回答并不容易,因为String是一个包含许多字段的复杂对象。这不仅仅是有多少个字符的问题。它还取决于系统上可用的内存量。在64GB RAM服务器上是一个问题吗?不,在手机上?是。变量太多可能会影响答案。

您正在通过优化来驱动您的代码,而这不是应该的方式。你应该根据你的功能来推动你的代码。

答案 3 :(得分:1)

准确测量内存使用情况的唯一方法是使用内存分析器。

我编写了一个简单的程序,可以分配5,000个符合您描述的数组。然后我用YourKit测量了它的内存使用情况。

阵列使用的内存量相差十倍:

  1. 如果所有数组使用相同的字符串文字,则总共需要大约200KB的RAM。
  2. 如果每个数组包含独特的随机生成的字符串(长度与第一种情况相同),则占用大约2MB的RAM。

答案 4 :(得分:0)

Jon Skeet是正确的(几乎总是如此),但您可以通过使用对enumsEnumSets的引用而不是对象的“无类型”字符串表示来大大减少内存使用量你在提议。

使用类型化数据,尤其是enums,也是很好的编码实践。