java如何创建⼤量的对象_jdk8foreach⼤量创建对象优化jdk8 foreach创建对象优化
lambda foreach 创建对象
@async
public void asyncfullesdoc() {
list docidlist = arrays.aslist(913,914);
if (collectionutil.isnotnullorempty(docidlist)){
list documents = new arraylist<>(500);
docidlist.foreach(docid ->{
queryknowledgedocresponse doc = synchronizeredisbasedoc(docid);
if (!stringutils.isblank(doc)){
map docmap = beantomap.objecttomap(doc);
redis doc
document document = new document();
document.string()).setdocument(docmap);
documents.add(document);
}
});
...
}
}
分析,对象释放优化
...
list 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 docmap = beantomap.objecttomap(doc);
document.string()).setdocument(docmap);
documents.add(document);
}
});
...
出现的bug,最后在addlist时最后⼀个值覆盖了前⾯所有值,但是foreach中对象的每个对象值都是不同的。
分析,代码继续优化
...
list documents = new arraylist<>(500);
document document = null;
for (integer docid: docidlist) {
document = new document();
queryknowledgedocresponse doc = synchronizeredisbasedoc(docid);
if (!stringutils.isblank(doc)){
map docmap = beantomap.objecttomap(doc);
document.string()).setdocument(docmap);
documents.add(document);
}
}
...
如果我还是想⽤lambda foreach 创建对象
...
list documents = new arraylist<>(800);
final document[] document = new document[1];
docidlist.foreach(docid ->{
queryknowledgedocresponse doc = synchronizeredisbasedoc(docid);
if (!stringutils.isblank(doc)){
map docmap = beantomap.objecttomap(doc);
document[0] = new document();
document[0].string()).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回收,这点重要)
需要更好管理内存。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。