当前位置: 移动技术网 > IT编程>开发语言>Java > jdk8foreach 大量创建对象优化

jdk8foreach 大量创建对象优化

2019年01月14日  | 移动技术网IT编程  | 我要评论

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

需要更好管理内存。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网