[alibaba/easyexcel]优化JVM回收性能问题

2024-05-24 793 views
1

在样例中,list.clear()。使得JVM回收。但其实性能非常的差,看源码为O(n)。 因此直接改为list = new ArrayList(BATCH_COUNT); 性能为O(1) 同时指定大小,养成不浪费内存的习惯。

使得后续使用者能按照比较优的样例来实践。

回答

1

在样例中,list.clear()。使得JVM回收。但其实性能非常的差,看源码为O(n)。 因此直接改为list = new ArrayList(BATCH_COUNT); 性能为O(1) 同时指定大小,养成不浪费内存的习惯。

使得后续使用者能按照比较优的样例来实践 你好,这样做是直接在堆重新开辟空间,弃用原来的list,让JVM达到一定条件时自己回收吧,list.clear()是手动去回收,所以效率低,是这样理解吧

7

@hxj1987 是的,可以这样理解。 你看源码会发现,list.clear它是一个for循环把每个位置都置为null,效率比直接重新new个差太多了。 尤其是数据量比较大的时候。

9

@hxj1987 是的,可以这样理解。 你看源码会发现,list.clear它是一个for循环把每个位置都置为null,效率比直接重新new个差太多了。 尤其是数据量比较大的时候。

请教一下 为什么要指定大小而不是直接new ArrayList<>()就行?

5

也是为了节约内存。ArrayList底层是一个数组,如果不指定则默认大小为10。 并且如果BATCH_COUNT过大的话,一直扩容非常影响性能。 所以指定大小既不浪费内存,也不会因为扩容而影响性能。 @GeneralAaron

7

也是为了节约内存。ArrayList底层是一个数组,如果不指定则默认大小为10。 并且如果BATCH_COUNT过大的话,一直扩容非常影响性能。 所以指定大小既不浪费内存,也不会因为扩容而影响性能。 @GeneralAaron

学到了,感谢。

7

暂时先不合并,实际测试并没有影响,cpu 运行很快,因为创建对象需要过tlab去堆里面开辟空间。非常感谢您这么细心。