jdk8foreach 大量创建对象优化
程序员文章站
2022-05-07 14:06:27
jdk8 foreach创建对象优化 lambda foreach 创建对象 @Async public void asyncFullEsDoc() { List docIdList = Arrays.asList(913,914); if (CollectionUtil.isNo ......
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回收,这点重要)
需要更好管理内存。
下一篇: MVC之Ajax异步操作