字节数组到字符串的转换导致OOM

时间:2018-08-08 11:22:02

标签: java memory byte

在我的应用程序中,我使用randomaccessfile存储字符串,并且在回读字符串时,我需要将字节数组转换为字符串,这导致OOM。除此以外,还有没有更好的转换方式

str =新的String(b,“ UTF-8”);

其中b是字节数组

1 个答案:

答案 0 :(得分:1)

  

除了new String(bytes, "UTF-8")以外,还有更好的转换方法吗?

这实际上是一个相当复杂的问题。

此构造函数不能简单地将byte[]合并到字符串中:

  • 在Java 9之前,始终需要将字节数组解码为char的UTF-16编码数组。因此,构造函数很容易分配源byte[]使用的内存大约两倍。

  • 对于Java 9,您可以选择对String使用新的紧凑表示形式。如果您执行AND操作,并且UTF-8编码的字节数组仅包含Unicode代码平面零(\u0000\u00ff)中的代码点,则String的值为{{1 }}。但是,即使在这种情况下,构造函数也必须将字节复制到新的byte[]

在两种情况下,都没有一种节省空间的方法可以从byte[]创建String。此外,我认为从字节流和字符计数开始的转换没有更节省空间的方式。 (我不包括修改byte[]实现或使用反射破坏抽象的东西。)

底线:将lava.lang.*转换为byte[]时,如果您希望代码在较旧的JVM上运行,则应至少允许连续的空闲内存是原始String的两倍。