Java中字符串的内存使用情况

10

我有一个Java对象,其中包含一个字符串。我想知道字符串的内存使用情况。我试图优化我的程序的内存使用情况,应用程序将拥有大约10000个这样的对象。对于像"Hello World"这样的字符串,它的内存使用情况会是什么样的?


2
https://dev59.com/4Wkw5IYBdhLWcg3ws833 - jdevelop
“Hello World”的内存使用量可能为11或22字节,这取决于编码方式。然而,如果您在几个位置都有相同的字符串,则它们可能是同一对象,并且您只需要为引用花费内存。 - Cruncher
1
@Cruncher:在Java中不存在“取决于编码”的情况。所有Java字符串对象在内部都以UTF-16(或某个版本)存储。 - user330315
@a_horse_with_no_name 好的,知道了。谢谢 :) - Cruncher
@a_horse_with_no_name UseCompressedStrings 会对这个计算有影响吗? - Vidya
@Vidya:嗯,说得好。老实说,我不太清楚。 - user330315
1个回答

12

Java使用每个字符两个字节*,因此您需要将字符数乘以二,以得到大致的近似值。除了存储“有效负载”外,您还需要考虑分配给字符串引用的空间,这通常等于目标体系结构上指针的大小,还需要为字符串长度分配空间,它是一个int,以及为缓存哈希码分配空间,这又是一个int

由于"Hello World"有11个字符,因此我估计其在具有32位指针的计算机上的大小为2*11+4+4+4=34个字节,或者在具有64位指针的计算机上的大小为2*11+8+4+4=38个字节。

注:此估计不考虑内部化字符串常量的影响。当字符串被 内部化 时,所有对内部化字符串的引用共享相同的有效负载,因此每个额外的内部化字符串实例的额外内存是一个引用的大小(即目标体系结构上的指针大小)。


* 除非使用-XX:+UseCompressedStrings选项,在这种情况下,不需要UTF-16的字符串使用UTF-8编码。

6
不要忘记内部字符串(String.intern)以及它们的池。我可以在每个类中声明 String s =“ Hi。”;,但它将在所有实例之间共享,因此它不是 X 个实例的 s.length() 倍。大致上是4+实例指针大小*实例数。 - MadConan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接