附上代码:
if (CollectionUtils.isNotEmpty(applyList)) {
//1.全量更新,超过1000个,考虑多线程处理;
if (applyList.size() > SPLIT_MAX_NUM) {//SPLIT_MAX_NUM为1000
try {
for (int i = 0; i < applyList.size(); i = i + SPLIT_MAX_NUM) {
List<> subapplyList = applyList.stream().skip(i).limit(SPLIT_MAX_NUM)
.collect(Collectors.toList());
threadPoolExecutor.execute(() -> {
for (类型 list : subapplyList) {
//做更新操作
}
});
}
} catch (Exception e) {
log.error("异常", e);
}
return;
}
//2.处理量小于最大值,直接做更新操作
for (类型 list : applyList) {
直接做更新操作
}
}
处理数据量大概在6万左右,报了频繁full gc的警告
想知道如果SPLIT_MAX_NUM的值设的大一点或者设的小一点会不会减少full gc
还有第二个问题,如果我用jvm分析工具,是堆内存使用的越小越好,还是说也要考虑老年代的使用情况
那个线程池你用的是什么类型的线程池?是不限任务队列大小的还是不限线程数量的?如果频繁创建线程对cpu和内存的压力都会很大的
用的哪个GC?配置参数是什么?你的applylist有多大的内存占用?
把SPLIT_MAX_NUM调成500了,占用的内存会小一点