Java string[] 与许多字符串中的内存使用
Java memory use in string[] vs many strings
谁能从内存使用的角度告诉我,一个字符串数组 (string[]) 包含 100 个字符串或 100 个字符串更好。
我想知道当内存问题很严重时什么是更好的方法。
String[]
使用 略多 的内存,特别是用 length
属性 创建数组引用。但是,我们讨论的差异很小,我会推荐更容易阅读的解决方案(我假设是数组)。
Java 对象有一个 8 字节的头,在一维数组的情况下,有 4 字节的开销来容纳数组长度。
例如,如果您创建 7 个字符串,则对象将使用 7 * 8 个字节 = 56 个字节的开销。如果将它们容纳在一维数组中,则将为数组对象添加 8 个字节 + 为数组长度添加 4 个字节,因此你将有 56 个字节 + 12 个字节 = 78 个字节的开销。
在多维数组的情况下,在Java中它们是一组数组,因此多维数组的每一行都有一个对象的开销。
这取决于您所说的内存类型以及您的意思 100 个字符串不在数组中。
让我们从我们可以肯定地说的开始。
如果我们假设字符串的创建方式相同,那么在这两种情况下,字符串的实际表示将占用相同数量的堆space。
100 个字符串本身可能比 String[]
具有 100 个元素的 个数量级 space,或者100 个 String
个变量。
区别在于我们如何保存对字符串的引用。
如果它们保存在 String[]
中,数组 object 将为数组元素占用 100 个堆字加上数组 [=60 的 3 或 4 个堆字=] 和填充。
如果它们作为 object 的实例字段保存,则字段需要 100 个堆字。 (加上可能的 object 的 header + 填充,如果不考虑的话。那将是 2 或 3 个堆字。)
如果它们作为静态字段保存,则需要 100 个堆字。 (加上可能隐藏的 "statics" object 的 header + 填充 ... 如果不考虑的话。)
如果它们作为局部变量保存,则不需要堆space。相反,引用将占用堆栈的 100 个字 space.
I want to know whats the batter approach when memory issues are critical.
如您所见,总体差异很小,可能小到不显着。
而且,在实践中,您还需要考虑使用数组与使用 100 个单独变量在代码大小上的差异。这将取决于应用程序如何使用字符串。事实上,代码大小的差异很容易淹没上述差异。
我的建议是不要理会这种思路。使用任何一种表示形式都能为您提供最具可读性和可维护性的代码。 1 或 2 个机器字的差异不太可能造成 显着 差异,即使您需要表示数百万个单独的字符串组。
谁能从内存使用的角度告诉我,一个字符串数组 (string[]) 包含 100 个字符串或 100 个字符串更好。
我想知道当内存问题很严重时什么是更好的方法。
String[]
使用 略多 的内存,特别是用 length
属性 创建数组引用。但是,我们讨论的差异很小,我会推荐更容易阅读的解决方案(我假设是数组)。
Java 对象有一个 8 字节的头,在一维数组的情况下,有 4 字节的开销来容纳数组长度。
例如,如果您创建 7 个字符串,则对象将使用 7 * 8 个字节 = 56 个字节的开销。如果将它们容纳在一维数组中,则将为数组对象添加 8 个字节 + 为数组长度添加 4 个字节,因此你将有 56 个字节 + 12 个字节 = 78 个字节的开销。
在多维数组的情况下,在Java中它们是一组数组,因此多维数组的每一行都有一个对象的开销。
这取决于您所说的内存类型以及您的意思 100 个字符串不在数组中。
让我们从我们可以肯定地说的开始。
如果我们假设字符串的创建方式相同,那么在这两种情况下,字符串的实际表示将占用相同数量的堆space。
100 个字符串本身可能比
String[]
具有 100 个元素的 个数量级 space,或者100 个String
个变量。
区别在于我们如何保存对字符串的引用。
如果它们保存在
String[]
中,数组 object 将为数组元素占用 100 个堆字加上数组 [=60 的 3 或 4 个堆字=] 和填充。如果它们作为 object 的实例字段保存,则字段需要 100 个堆字。 (加上可能的 object 的 header + 填充,如果不考虑的话。那将是 2 或 3 个堆字。)
如果它们作为静态字段保存,则需要 100 个堆字。 (加上可能隐藏的 "statics" object 的 header + 填充 ... 如果不考虑的话。)
如果它们作为局部变量保存,则不需要堆space。相反,引用将占用堆栈的 100 个字 space.
I want to know whats the batter approach when memory issues are critical.
如您所见,总体差异很小,可能小到不显着。
而且,在实践中,您还需要考虑使用数组与使用 100 个单独变量在代码大小上的差异。这将取决于应用程序如何使用字符串。事实上,代码大小的差异很容易淹没上述差异。
我的建议是不要理会这种思路。使用任何一种表示形式都能为您提供最具可读性和可维护性的代码。 1 或 2 个机器字的差异不太可能造成 显着 差异,即使您需要表示数百万个单独的字符串组。