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();
    }
  • 相关阅读:
    php性能测试工具
    linux的openssl
    Nginx与Apache的Rewrite规则的区别
    mysql索引总结----mysql 索引类型以及创建
    不支持正在使用的 .Net 组帧模式。有关详细信息,请参阅服务器日志--解决方案
    c#获取网页源代码
    关于线程间操作无效: 从不是创建控件“xx”的线程访问它,错误解决方法(自定义委托和系统委托Action或Func解决)
    联想笔记本官网驱动下载
    easy ui combotree的操作
    c# 搜狗拼音输入法,刷输入速度和累计输入
  • 原文地址:https://www.cnblogs.com/huangrenhui/p/11365141.html
Copyright © 2011-2022 走看看