記錄因Sharding Jdbc批量操作引發的一次fullGC( 二 )

GC 情況如下:

記錄因Sharding Jdbc批量操作引發的一次fullGC

文章插圖
cache 里面存有元素:
記錄因Sharding Jdbc批量操作引發的一次fullGC

文章插圖
可以看出 GC 次數有減少,本地緩存的條數由 600 多減到了 11 個,如果導出堆內存還能看出至少降低了幾百 M 的本地內存占用 。
另外 , 這個 cache 是有大小限制的,如果因為一個 sql 占了 600 多個位置,那么其他的 sql 的緩存就會被清理,導致其他 SQL 性能會受到影響,甚至如果機器本身內存不高,還會因為這個 cache 過大而導致頻繁的 Full GC
大家以后在使用 Sharding JDBC 進行批量操作的時候就需要多注意了
另附上拆分為固定大小的數組的工具方法如下:
public class ShardingUtils {private static Integer[] nums = new Integer[]{800,500,300, 200, 100, 50, 25, 10, 5, 2, 1};public static <T> List<List<T>> shard(final List<T> originData) {return shard(originData, new ArrayList<>());}private static <T> List<List<T>> shard(final List<T> originData, List<List<T>> result) {if (originData.isEmpty()) {return result;}for (int i = 0; i < nums.length; i++) {if (originData.size() >= nums[i]) {List<T> ts = originData.subList(0, nums[i]);result.add(ts);List<T> ts2 = originData.subList(nums[i], originData.size());if (ts2.isEmpty()) {return result;} else {return shard(ts2, result);}}}return result;}}

推薦閱讀