我正在寻找一种方法来反序列化Java 中String
的 abyte[]
并尽可能少地产生垃圾。因为我正在创建自己的序列化器和反序列化器,所以我可以完全自由地在服务器端(即序列化数据时)和客户端(即反序列化数据时)实现任何解决方案。
通过遍历字符(_ String
_ _ 这里有一个很好的辩论。另一种方法是使用反射直接访问底层,但这超出了问题的范围。String's
String.charAt(i)
char
String's
char[]
但是,我似乎不可能在byte[]
不创建char[]
两次的情况下反序列化,这似乎很奇怪。
步骤:
- 创造
char[]
- 遍历
byte[]
并填写char[]
String(char[])
使用构造函数创建字符串
由于 Java 的String
不变性规则,构造函数会复制 char[],从而产生 2 倍的 GC 开销。我总是可以使用机制来规避这一点(不安全String
的分配 + 反射来设置char[]
实例),但我只是想问一下,除了打破关于String's
不变性的所有约定之外,这是否有任何后果。
当然,对此最明智的回应是“来吧,停止这样做并信任 GC,原始char[]
将非常短暂,G1 将暂时摆脱它”,这实际上是有道理的,如果char[]
较小超过 G1 区域大小的 1/2。如果它更大,char[] 将被直接分配为一个巨大的对象(即自动传播到 G1 的区域之外)。在 G1 中,此类对象极难有效地进行垃圾回收。这就是为什么每个分配都很重要。
关于如何解决这个问题的任何想法?
非常感谢。