Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java';s的字符串内存使用率很高?_Java_String_Memory - Fatal编程技术网

为什么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个字节

对于支持阵列不共享的
“苹果电脑”
,最低成本为

  • 支持16个字符的数组--32B,它在字边界上很好地对齐
  • 指向数组-4或8B的指针,具体取决于平台
  • 三个
    int
    s代表偏移量、长度和记忆哈希代码-12B
  • 2倍对象开销-取决于虚拟机,但这是一个很好的经验法则
  • 一个
    int
    表示数组长度
  • 因此大约有72B,其中实际有效载荷占44.4%。对于较长的字符串,有效负载构成更多


    在Java7中,一些JDK实现是为了避免将大的
    char
    []固定在内存中。这使得他们可以去掉三个
    int
    s中的两个


    这将长度为16的字符串的计算更改为64B,其中实际有效负载占50%。

    是否可以使用比Java字符串更少的内存来保存字符数据?对

    这对“企业”应用程序(甚至是Android或J2ME应用程序,它们必须使用更少的内存)重要吗?几乎从来没有


    过早优化是根…

    因为字符串是不可变的,所以对它执行的操作实际上可以节省空间,因为字符串可以共享内存。但是每次创建新的
    String
    对象时,它不会占用更多内存吗?基元使用32字节?我想你指的是比特@真是太棒了。愚蠢的错误。更正。谢谢。@Kazekage创建新字符串时占用更多内存取决于它的方式。在常量表达式的情况下,实际字符串值在全局池中由您拥有的引用共享。否则,将始终创建新的字符串对象。通过调用string类的intern()方法,可以强制共享和重用string对象。