欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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回收,这点重要)

需要更好管理内存。