Java中String的内存使用情况

And*_*v93 9 java memory string

我在Java中有一个包含String的对象.我很好奇String的内存使用情况如何.我正在尝试优化我的程序的内存使用量,应用程序将有大约10000个这样的对象.对于诸如"Hello World"之类的字符串,内存使用量是多少?

das*_*ght 9

Java每个字符使用两个字节*,因此您需要将字符数乘以2才能得到粗略的近似值.除了存储"有效负载"之外,您还需要考虑分配给字符串引用的空间,这通常等于目标体系结构上指针的大小,字符串长度的空间,这是一个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编码.

  • 不要忘记内部字符串(String.intern)和它们的池.我可以在每个类中声明`String s ="Hi.";`但它将在所有实例中共享,因此不是X实例的时间是s.length().它大约是4 +实例指针大小*实例. (4认同)