代码优

张彪

少用Lamba表达式 特别是在循环里,同时该逻辑一个循环就可以解决问题

反例:showFlag 大概7000条

start =System.currentTimeMillis();
showFlag = showFlag.stream().filter(t -> ids.contains(MapUtils.getInteger(t, "Id"))).collect(Collectors.toList());
Map<String,Map> showFlagMap = showFlag.stream().collect(Collectors.toMap(c ->MapUtils.getString(c, "Id"), t -> t));
log.error("lamba耗时:" + (System.currentTimeMillis() - start) + "毫秒");

正例:直接遍历封装数据

for(Mapitem : showFlag){
    if(ids.contains(MapUtils.getInteger(item, "Id"))){
        showFlagMap.put(MapUtils.getString(item, "Id"),item);
    }
}

禁止在controller中写业务逻辑

CPU飙升问题查询,接口响应失败

windows 打开任务管理器,查看cpu飙升的服务

linux top 命令查看服务资源使用情况

mysql 进程 mysqld 占用高 一般是sql有问题效率低

sql查询 show PROCESSLIST

查看当前耗时较多的sql或者数量比较多的sql 使用explain命令查看sql是否命中索引,同时找到代码中调用sql的地方,是否存在违规操作如循环调用等,根据业务逻辑优化sql查询 去掉不必要的字段查询和表连接

mongodb 使用 db.currentOp() 处理方法类似

后台cpu飙升,一般出现死循环,需要打印出堆栈信息 使用jdk 工具jstack ,查看堆栈异常

以windows为例,我们使用jdk自带的工具查看堆栈的使用情况,具体目录bin下的jvisualvm.exe,监控eiot服务需要,在eiot.bat文件修改以下内容,开启远程监控

java -jar -Dfile.encoding=UTF-8 -Dcom.sun.management.jmxremote.port=11111 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false D:\\acrel-iot\\server\\eiot\\service-eiot-web-1.0.jar --spring.config.location=classpath:/bootstrap.yml,./config/,classpath:/,./config/ --spring.profiles.active=prod-win

使用工具连接

以此次工业能耗调优为例,打开发现treemap对象使用异常,查看后台使用treemap的地方,全局搜索发现没有地方使用,怀疑是其他基础类使用了treemap,再查看treeset使用到了treemap 继续搜索treeset,发现几处使用的地方都没有问题,这个就比较棘手了,说明是框架问题导致的,同时发现定时任务框架使用到了treeset ,猜测是定时任务导致的,为进一步定位问题 查看java线程问题