zoukankan      html  css  js  c++  java
  • 自己挖的坑自己填--JVM报内存溢出

    在写定时任务时,对表数据进行批量操作,测试数据有10万条左右,在测试时发现跑着跑着出现内存溢出现象,最后发现创建的对象paramList 和tmBeanList没有被回收,经过资料查找,发现是循环内不要不断创建对象引用,不然有count次循环,内存中就有count份对象引用存在,就耗费内存了,所以每次循环完都得对对象引用进行销毁(设置为null);或直接在for循环体外声明对象,在循环体内创建对象的引用,这样内存中只有一份对象引用,每次new对象时,对象引用指向不同,但内存中只有一份。

    /**
     * 定时任务,xxxx
     * @author xxx
     * @date xxx
     * @version xxx
     */
    @Component(value = "xxxJob")
    public class xxxJob {
    
        @Transactional
        public void doService(Map<String, Object> scheduleJob) {
            logger.info("------------开始定时任务,xxxxx----------");
            // 业务逻辑
            ---省略业务代码---
            for (Map<String, Object> map : list) {
                try {
                    ---省略业务代码---
                    List<Map<String, Object>> tmBeanList = tMemberRfmDao.queryBeanForMap(tmr);
                    List<Map<String, Object>> paramList = new ArrayList<>();
                    if (!CollectionUtils.isEmpty(tmBeanList)) {
                        ---省略业务代码---
                        for (Map<String, Object> member : tmBeanList) {
                            String memberId = (String) member.get("member_id");
                            Map<String, Object> tml = new HashMap<>();
                            ---省略业务代码---
                            tml.put("data_status", 0);
                            tml.put("create_time",
                                    DateUtils.getDate("yyyy-MM-dd HH:mm:ss"));
                            tml.put("update_time",
                                    DateUtils.getDate("yyyy-MM-dd HH:mm:ss"));
                            paramList.add(tml);
                            if(paramList.size() == INT_TWO_THOUSAND){
                                tMemberLabelDao.saveBatch(paramList);
                                paramList.clear();
                            }
                        }
                        if(paramList.size() != 0){
                            tMemberLabelDao.saveBatch(paramList);
                        }
                        paramList = null;
                        tmBeanList = null;
                        ---日志---
                    }else{
                        ---日志---
                    }
                } catch (Exception e) {
                    ---异常---
                }
            }
            logger.info("------------结束定时任务,xxxx");
        }
    }
    备注(循环外声明对象,循环体内创建对象引用,Object对象引用指向不同的Object):
    Object object = null;
    for(int i = 0;i <=count; i++){
    object = new Object();
    }
  • 相关阅读:
    Centos7安装go.10.1环境
    centos7安装PHP5
    Linux 无文件攻击memfd_create()具体操作步骤
    centos7 '/mnt/hgfs'下共享文件夹不显示问题
    fiddler连接代理手机无法上网问题解决办法
    centos 镜像软件安装包版本低,手动安装过程
    0 upgraded, 0 newly installed, 0 to remove and 112 not upgraded解决方法
    JavaScript高级程序设计(第3版)第七章读书笔记
    JavaScript高级程序设计(第3版)第六章读书笔记
    JavaScript高级程序设计(第3版)第五章读书笔记
  • 原文地址:https://www.cnblogs.com/huangrenhui/p/11365141.html
Copyright © 2011-2022 走看看