ArrayList创建优化分析

说到ArrayList大家都知道底层是一个数组,在创建对象得时候通常会直接这样

ArrayList创建优化分析

我们可以运行此代码,然后通过jstat命令看一下,jvm得GC情况:

ArrayList创建优化分析

明显可以看出在休眠25后jvm中得E区占有量从原来得1311.1一下子飙升到10606.2已经接近快把E区占满得状态,下来就会触发ygc。

我们在看给集合定义初始大小得结果:

ArrayList创建优化分析

还是通过jstat来查看jvm情况

ArrayList创建优化分析

在线程休眠过后jvm年轻代中E区的占有量从原来的1311.1升到5325.1才达到E区总容量的1/3。说明在不定义集合大小时,在向集合插入数据时会产生大量的垃圾对象。这些对象可能存在失去了引用而要被回收的可能。

我们可以通过源码得出:

ArrayList创建优化分析

ArrayList创建优化分析

ArrayList创建优化分析

ArrayList创建优化分析

在不定义初始大小的集合的时候而是在往里边 add 第一个数据的时候会扩容到 10.

 

既然知道了默认的长度为 10 ,那说明后续一旦写入到第九个元素的时候就会扩容为 10*1.5=15。这一步为数组复制,也就是要重新开辟一块新的内存空间存放这 15 个数组。

这样只要满足数组现存数据大小加1大于现在数组的长度就会进行扩容,那么elementData就会一直引用新的数组对象,老的数组对象就会失去引用,那么自然就会产生大量的垃圾对象,等待gc回收。对于程序的运行有一个非常不好的影响。所以我们平时在定义arraylist这种集合时(尤其数据量比较大的时候),能定义初始大小一定要定义初始大小,这样有利于我们程序的性能提升。