Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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
为什么JProfiler向我显示了200+的如此大的开销;Java中每个字符[]的字节数?_Java_Scala_Oop_Memory_Jvm - Fatal编程技术网

为什么JProfiler向我显示了200+的如此大的开销;Java中每个字符[]的字节数?

为什么JProfiler向我显示了200+的如此大的开销;Java中每个字符[]的字节数?,java,scala,oop,memory,jvm,Java,Scala,Oop,Memory,Jvm,JProfiler告诉我5M字符[]实例占用2.5GB。这些char[]中的文本本身在一个文件中总共有1.2GB。1.3GB的开销似乎来自数组实例、它们的字段(如长度)以及JVM可能进行的任何对齐。但看起来还是太多了? 在更高的层次上,我保存在内存中的是一个HashMap。 JProfiler告诉我: 5M char[]: 2.5GB 5M String: 126MB 2.6M HashMap$Node: 84MB 请告知,为什么JVM会为char[]实例占用如此多的堆开销,或者JProfil

JProfiler告诉我5M字符[]实例占用2.5GB。这些char[]中的文本本身在一个文件中总共有1.2GB。1.3GB的开销似乎来自数组实例、它们的字段(如长度)以及JVM可能进行的任何对齐。但看起来还是太多了? 在更高的层次上,我保存在内存中的是一个HashMap。 JProfiler告诉我:

5M char[]: 2.5GB
5M String: 126MB
2.6M HashMap$Node: 84MB

请告知,为什么JVM会为char[]实例占用如此多的堆开销,或者JProfiler无法如此准确地报告每个类实例的堆消耗量?

如注释中所述,这是因为java中的char是无符号的2字节值。因此,如果将ascii文件读入
字符串
对象,您应该期望大约2倍的开销

正如@Eugene和@Jurah Martinka所指出的,较新的虚拟机对此进行了优化。
您可以查看有关这些优化的更多信息。

您在char[]数组中存储的具体内容是什么?数组长度的分布是什么样子的?你能给我们一个MRE更好吗?这可能是一个很长的机会,但你知道字符在Java中是两个字节,对吗?@NicuMarasoiu或者你可以升级到Java-9或更高版本,其中字符串(拉丁文1)存储为
byte[]
。正如@Eugene所说的,较新的JDK具有“紧凑字符串”优化应该减少开销,至少对于ASCII字符串(只要字符串中有非ASCII字符,开销就会反弹)。是的,使用了Java11,它也可以很好地编译Scala