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