微服务生成PDF时,如何降低处理文档列表的堆空间占用?
问题解答
结论:这种改动不仅不会降低堆空间占用率,反而大概率会增加内存开销
原因如下:
- 原方案里,所有生成的Document对象都存在同一个主ArrayList中,内存主要消耗在Document本身(包括PDF数据),只有这一个列表对象的额外开销。各个文档服务只是往这个列表里追加元素,不会产生新的列表实例。
- 改成每个服务返回新列表的方式后,每个服务都会创建至少一个新的ArrayList实例(哪怕里面没有元素),这些临时列表本身会占用额外堆空间(比如内部的数组、size字段等)。最后主服务合并时,还是要把这些临时列表里的Document对象全部转移到主列表,Document的内存开销一点没少,反而多了一堆临时列表的内存消耗。
如果想优化堆空间占用,建议从这些方向入手:
- 生成PDF后及时清理中间临时资源(比如生成时用到的模板文件流、临时缓冲字节数组等),不要让冗余数据留在Document对象里。
- 给主ArrayList设置合理的初始容量,避免频繁扩容导致的内存浪费(ArrayList扩容会创建新数组并拷贝旧元素,期间会有两份数组占用内存)。
- 如果生成的文档数量极大,可以考虑分批处理:每生成一批就存入数据库,然后清空当前列表释放内存,再处理下一批。
内容的提问来源于stack exchange,提问作者Rey Rajesh
相关产品推荐
相关产品推荐

