【问题标题】:Memory usage of a Java String ArrayJava 字符串数组的内存使用情况
【发布时间】:2012-01-17 12:34:00
【问题描述】:

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

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

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

所以回顾一下,一个字符串数组(如果它是可量化的)占用了多少空间?

【问题讨论】:

  • 你可以测量。但是假设每个都是 1k,比您在此处显示的要大。那是5M。除非您的内存不足,否则 IMO 不值得担心。你是? (可能不需要重述一个四句问题。)
  • 你可以通过查看字符串源来粗略估计。 String 将其内容存储在字符数组中,每个字符在 java 中为 2 个字节。 String 里面还有几个字段。
  • 如果您想要实际总数,VisualVM(JDK 随附)等分析器可以告诉您这一点,而无需计算。

标签: java data-storage arrays


【解决方案1】:

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

如果您对总存储量感兴趣,您应该算出您拥有多少个单独的 String 对象,以及 还有您拥有多少个数组。如果您有 5000 个数组,但它们大多包含对相同几个字符串的引用,那可能没问题。如果你有 5000 个数组,每个数组包含 5 个在其他任何地方都没有使用过的字符串,那就是 25,000 个字符串......这仍然可能不是很多(长度为 20 的字符串可能需要大约 60 个字节)。

当然,这里的上下文很重要:您的代码将在什么上运行?如果它在台式电脑上运行,那么几兆可能不是问题……可能在手机上更成问题。

【讨论】:

  • 谢谢,所以我应该找出每个字符串在数组中占用的空间,然后乘以 5,000。我现在就这样做并重新发布。
  • @Russell:嗯,不是真的——因为这取决于这些字符串是否共享。
  • 它应该在中端计算机上运行。我已经使用了你的事实,它会运行得很好。 (完成后的程序将占用一半左右)
  • 每个引用可以占用80字节?这是(N * 8 + 20) 的错字还是真的那么大?
【解决方案2】:

字符串数组可以随心所欲吗?您定义字符串数组的大小。 字符串 [] abc = 新字符串 [80]。 但我想你已经知道了。也许我没有得到你的问题。

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

Integer.MAX_VALUE 或可用堆?也许最大可用尺寸?

【讨论】:

    【解决方案3】:

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

    您正在通过优化来驱动您的代码,而这不是应有的方式。你应该按照你想要做的事情来驱动你的代码。

    【讨论】:

    • 我对做出这样的笼统声明有点谨慎;在嵌入式设备上,您的算法/存储机制很可能受到设备限制的驱动。
    【解决方案4】:

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

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

    数组使用的内存量变化了十倍:

    1. 如果所有数组都使用相同的字符串字面量,它们总共会占用大约 200KB 的 RAM。
    2. 如果每个数组包含唯一的随机生成的字符串(长度与第一种情况相同),它们会占用大约 2MB 的 RAM。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-03-21
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多