@x-power
2023-02-06T05:36:14.000000Z
字数 531
阅读 389
面试
可以将Gson和StringBuilder分开讲。
最初是InputStreamReader(multipartFile.inputStream).readText()
通过inputStream获取multipartFile的输入流,通过InputStreamReader将原本的字节流转化为字符流然后通过readText将其转化为字符串。
字节流和字符流之间的转化经过当时限定堆内存的测试是没有问题的,根据报错的OutofMemory然后向上寻找发现,问题出现在了readText里面有在使用StringBuffer,问题就出在StringBuffer这里,其继承了AbstractStringBuilder其中扩容的时候使用方法是新字符串长度的二倍加2,这样的话就会造成原先内存的三倍大小(加上原来的字节流)。
其中的Gson是通过StringReader将字符流在转化为字节流去进行toObject,
StringBuilder的扩容方案,不让他直接申请二倍大小,而是不够的话 按照几k的大小进行扩容。在持久化存储的时候需要写为txt文件,其也可以使用字节流直接存储
