为什么Java';s的字符串内存使用率很高?
在这方面,据说字符串的最小内存使用量是:为什么Java';s的字符串内存使用率很高?,java,string,memory,Java,String,Memory,在这方面,据说字符串的最小内存使用量是: 8*(int)(((无字符)*2)+45)/8)bytes 因此,对于字符串“Apple Computers”,最小内存使用量为72字节。 即使我有10000个长度是这个长度两倍的字符串对象,内存使用量也不会超过2Mb,这一点都不多。那么这是否意味着我低估了企业应用程序中存在的字符串数量,或者这个公式是错误的 谢谢与您拥有的其他数据类型相比,它肯定很高。其他原语使用32位、64位等 鉴于String是不可变的,每次对其执行任何操作时,都会创建一个新的St
8*(int)(((无字符)*2)+45)/8)
bytes
因此,对于字符串“Apple Computers”,最小内存使用量为72字节。即使我有10000个长度是这个长度两倍的字符串对象,内存使用量也不会超过2Mb,这一点都不多。那么这是否意味着我低估了企业应用程序中存在的字符串数量,或者这个公式是错误的
谢谢与您拥有的其他数据类型相比,它肯定很高。其他原语使用32位、64位等
鉴于
String
是不可变的,每次对其执行任何操作时,都会创建一个新的String
对象,从而消耗更多内存。Java中的字符串存储取决于字符串的获取方式。备份char
数组可以在多个实例之间共享。如果不是这样的话,那么通常的对象开销加上一个指针和三个int
s的存储,通常会产生16字节的开销。然后,由于char
s是UTF-16代码单元,因此支持数组需要每个char
2个字节
对于支持阵列不共享的“苹果电脑”
,最低成本为
int
s代表偏移量、长度和记忆哈希代码-12Bint
表示数组长度在Java7中,一些JDK实现是为了避免将大的
char
[]固定在内存中。这使得他们可以去掉三个int
s中的两个
这将长度为16的字符串的计算更改为64B,其中实际有效负载占50%。是否可以使用比Java字符串更少的内存来保存字符数据?对 这对“企业”应用程序(甚至是Android或J2ME应用程序,它们必须使用更少的内存)重要吗?几乎从来没有
过早优化是根…因为字符串是不可变的,所以对它执行的操作实际上可以节省空间,因为字符串可以共享内存。但是每次创建新的
String
对象时,它不会占用更多内存吗?基元使用32字节?我想你指的是比特@真是太棒了。愚蠢的错误。更正。谢谢。@Kazekage创建新字符串时占用更多内存取决于它的方式。在常量表达式的情况下,实际字符串值在全局池中由您拥有的引用共享。否则,将始终创建新的字符串对象。通过调用string类的intern()方法,可以强制共享和重用string对象。