Java 9 中的字符串(String)压缩的改进
我们都知道 Strings 在 Java 中使用 char[] 数组来实现的。
每一个 char[] 数组中的元素将会使用 2 个字节(byte)的存储空间,这是因为 Java 最初的实现使用 UTF-16 字符集。
如果你不需要存储其他语言,你的语言只有英文,或者 ASCII 码就可以满足的情况下,Java String 使用的 char[] 数组中存储的字符元素还是会使用 UTF-16 字符集,那么就会导致存储一个字符的时候,我们使用了 2 字节,16 位。但是,因为我们又全是因为,那么存储的这个字符的前 8 位全部都会为 0。
因为 ASCII 使用单字节存储,这明显是一个存储空间的浪费。
实际上,很多字符存储都需要使用 2 字节,比如 UTF-8,比如 GBK,但是针对因为和 拉丁文 LATIN-1 使用 1 个字节的存储就够了,很显然这里有一个可以改进的空间。
在 JDK 9 之前,Java 不管什么字符都一股脑的使用 2 字节存储,在 JDK 9 以后,Java 对这里进行了改进。
同时我们知道 Java 是使用 String Pool 来存储的,String Pool 通常使用了 JVM 的 heap 内存空间,Heap 内存空间又是 JVM 垃圾清理程序活动的地方。
在老的设计中,String 占用了 2 个字节,但是很多时候可能用不到,如果我们对这里进行了改进的话,我们也能提高垃圾清理程序的工作量。
显然这个是需要重新考虑的问题。
在本页面中,我们将会讨论在 JDK 6 中使用的 Java String 的压缩选项和在 JDK 9 中使用的新的方法。
这 2 种方法主要目的就是为了降低 String 在 JVM 中内存消耗,提供空间利用率。