为什么 JProfiler 向我显示 Java 中每个 char[] 有 200 多个字节的巨大开销?

Why does JProfiler shows me such a big overhead of 200+ bytes per char[] in Java?

JProfiler 告诉我 5M char[] 实例需要 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 可能无法对每个 class 实例的堆消耗进行如此准确的报告?

如评论中所述,这是因为 java 中的字符是无符号的 2 字节值。因此,如果您将 ascii 文件读入 String 对象,您应该预计大约有 2 倍的开销。

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