jdk8foreach 大量创建对象优化
2019-01-15 07:02:58来源:博客园 阅读 ()
jdk8 foreach创建对象优化
lambda foreach 创建对象
@Async
public void asyncFullEsDoc() {
List<Integer> docIdList = Arrays.asList(913,914);
if (CollectionUtil.isNotNullOrEmpty(docIdList)){
List<Document> documents = new ArrayList<>(500);
docIdList.forEach(docId ->{
QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
if (!StringUtils.isBlank(doc)){
Map<String, Object> docMap = BeanToMap.objectToMap(doc);
Document document = new Document();
document.setDocumentId(docId.toString()).setDocument(docMap);
documents.add(document);
}
});
...
}
}
分析,对象释放优化
...
List<Document> documents = new ArrayList<>(500);
Document document = new Document();
docIdList.forEach(docId ->{
//用于对象释放
document.setDocumentId(null);
document.setDocument(null);
QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
if (!StringUtils.isBlank(doc)){
Map<String, Object> docMap = BeanToMap.objectToMap(doc);
document.setDocumentId(docId.toString()).setDocument(docMap);
documents.add(document);
}
});
...
出现的bug,最后在addList时最后一个值覆盖了前面所有值,但是foreach中对象的每个对象值都是不同的。
分析,代码继续优化
...
List<Document> documents = new ArrayList<>(500);
Document document = null;
for (Integer docId: docIdList) {
document = new Document();
QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
if (!StringUtils.isBlank(doc)){
Map<String, Object> docMap = BeanToMap.objectToMap(doc);
document.setDocumentId(docId.toString()).setDocument(docMap);
documents.add(document);
}
}
...
如果我还是想用lambda foreach 创建对象
...
List<Document> documents = new ArrayList<>(800);
final Document[] document = new Document[1];
docIdList.forEach(docId ->{
QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
if (!StringUtils.isBlank(doc)){
Map<String, Object> docMap = BeanToMap.objectToMap(doc);
document[0] = new Document();
document[0].setDocumentId(docId.toString()).setDocument(docMap);
documents.add(document[0]);
}
});
...
分析
Object object= new Object();
写在100个循环内等于你有100个引用对应了100个对象,所以100个对象在一段时间都占用内存,知道内存不足GC主动回收。
object = new Object();
写在100个循环内等于你使用1个引用分别100次调用了100个对象,所以当后一个对象init后,前一个对象已经是“无引用状态”,会很快的被GC自动回收(在你的循环还没结束时,可能已经进行了多次GC回收,这点重要)
需要更好管理内存。
原文链接:https://www.cnblogs.com/sunyk/p/10264258.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Java高阶语法---final
下一篇:Java运行时环境---内存划分
- eclipse下创建Maven项目(包含webapp目录结构) 2020-06-09
- SpringBoot通过web页面动态控制定时任务的启动、停止、创建 2020-06-09
- 数组小Demo 2020-05-25
- Android连载13-创建启动活动类 2020-05-25
- 阿里面试官鬼得很,问我为什么他们要禁用Executors创建线程 2020-05-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash