零 干货满满

1测试环境开启GC日志

-Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC 

2 GC日志在线析平台 将gc日志导入,方便可视化查看Universal JVM GC analyzer - Java Garbage collection log analysis made easyhttps://gceasy.io/https://gceasy.io/

3 常用定位Cpu的linux命令((复制粘贴直接用)运气好的话,这几个命令执行完,就找到了代码中的问题)

# 高cpu
#linux命令1 所有进程的系统使用情况,确定是不是自己的应用cpu高
top
#2 找到自己的进程id
ps -ef|grep edp.DavinciServerApplication
#3 找到自己进程下的最占用cpu的线程
top -Hp 进程id
#4 将线程ID转为16进制,目的是为了在jstack生成的信息中进行查找
printf "%x\n" 线程ID
#5 打印进程信息,查看该线程的执行代码栈信息jstack 进程ID |grep 线程ID十六进制 -A 30

4arthas 使用解决问题。(上边linux命令不好解决,用这个,复制粘贴直接用)

# 1下载arthas,一共就148kb 很快
curl -O https://alibaba.github.io/arthas/arthas-boot.jar# 2启动arthas,启动后找到自己的程序ID,输入ID,回车。
java -jar arthas-boot.jar# 3查看信息命令
dashboard # 4 查看最占用cpu的三个线程的信息。
thread -n 3 # 5 根据打印的代码信息,找到代码中写的不合适的地方,进行修改。

5 火焰图生成查看。(查看系统中哪些代码占用cpu)

#arthas中使用
profiler start# 等待几十秒后执行
profiler stop 生成html文件打开就好

一 背景说明

项目中用到了POI进行导出数据,当数据量比较大时,会出现CPU超过百分之百的问题,引发报警,因为是数据分析平台,报警非常随机,当同时下载的用户比较多时,且数据量很大时,就会引发报警。

二 排查流程

1 网上百度大部分说Cpu问题是频繁gc导致的,首先查看prometheus,只能发现Eden区是比较满的,gc也不是很频繁。于是又在测试环境,配置了项目启动的gc日志,启动脚本中增加以下参数:

-Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC 
if [[ $1 = "development" ]] || [[ $1 = "testing" ]]; thensleep 3snohup $JAVA_HOME/java -Dlog4j2.formatMsgNoLookups=true -Dfile.encoding=UTF-8 -Dspring.profiles.active=$ENV -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8913 -cp $JAVA_HOME/lib/*:lib/* -Xmx28672m -Xms28672m -Xmn14336m -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC edp.DavinciServerApplication >$LOG_PATH 2>&1 &
elsenohup $JAVA_HOME/java -Dlog4j2.formatMsgNoLookups=true -Dfile.encoding=UTF-8 -Dspring.profiles.active=$ENV -cp $JAVA_HOME/lib/*:lib/* -Xmx28672m -Xms28672m -Xmn14336m -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M edp.DavinciServerApplication >$LOG_PATH 2>&1 &
fi

于是在相应的路径下找到GC日志信息,将gc日志导入到分析可以看到也不频繁,而且没有full gc。所以可以排除是频繁gc导致的cpu过高的问题。Universal JVM GC analyzer - Java Garbage collection log analysis made easyFree online java GC log analyzer. Analyze JVM, Android garbage collection logs. Troubleshoot long GC pause, memory leak, OutOfMemoryError. Java GC tuning, memory settings tunning made easyhttps://gceasy.io/

2 进行代码栈查看,寻找是否有高计算的代码,或者是频繁切换线程的代码。

首先用的是linux的命令进行操作

# 高cpu
#linux命令1 所有进程的系统使用情况,确定是不是自己的应用cpu高
top
#2 找到自己的进程id
ps -ef|grep edp.DavinciServerApplication
#3 找到自己进程下的最占用cpu的线程
top -Hp 进程id
#4 将线程ID转为16进制,目的是为了在jstack生成的信息中进行查找
printf "%x\n" 线程ID
#5 打印进程信息,查看该线程的执行代码栈信息jstack 进程ID |grep 线程ID十六进制 -A 30

但是我的情况比较特殊,我是一个下载线程池的多个线程下载生成excel,一个线程池的多个线程sheet生成,所以线程会有切换,不是一个线程持续cpu高的情况,等我将线程id转为16进制,再去jstack,查看的时候已经是waiting状态了。所以一直没有跟踪出问题代码所在。

然后查到arthas比较好用,所以下载尝试使用

# 1下载arthas,一共就148kb 很快
curl -O https://alibaba.github.io/arthas/arthas-boot.jar# 2启动arthas,启动后找到自己的程序ID,输入ID,回车。
java -jar arthas-boot.jar# 3查看信息命令
dashboard # 4 查看最占用cpu的三个线程的信息。
thread -n 3 # 5 根据打印的代码信息,找到代码中写的不合适的地方,进行修改。

通过打印最占用cpu的三个线程的信息,发现代码中有个解析json的代码,在for循环中,由String解析为json比较占用cpu。

将该代码修改到for循环外边进行执行。

POI导出数据至Excel,cpu飙升 cpu占用很高,原因排查相关推荐

  1. 使用POI导出数据到excel代码

    使用POI导出数据到excel代码 POM文件 <!-- 导出excel --> <dependency><groupId>org.apache.poi</g ...

  2. Java使用poi导出数据到excel(包括xls和xlsx两种格式)并通过浏览器下载

    情景:将数据导出到excel是java开发常用的功能,数据量不大的时候,xls和xlsx两种格式的文件都行,但是数据量太大的时候就有区别了,xls格式的文件一个sheet页最多只能存六万多条数据,而x ...

  3. java导出为excel文件_java导出数据到excel文件

    有的时候,将一些有用的数据导出到excel是很有必要的.比如说,我现在在做一个学校的在线教学平台,有一个需求是:将学生成绩导出到excel文件中去. 那怎样实现用java导出数据到excel文件呢?? ...

  4. spring boot实现导出数据到excel

    1.导入依赖; <!--数据导出依赖 excel--> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...

  5. Java导出数据到Excel文件

    Java导出数据到Excel文件 前言 如何导出 导出的基本流程 测试结果 测试数据及结果 测试代码 ExcelExportUtil.class 遇到的问题 lombok的问题 解决 Cell.set ...

  6. 基于EasyExcel锁定指定列导出数据到excel

    基于EasyExcel锁定指定列导出数据到excel 大家好,我是llp.最近在做系统报表时中有一个需求时这样的,需要查询系统数据导出excel,并要求导出的excel列中有一些时锁定的有一些时不锁定 ...

  7. java导出文件到excel文件怎么打开_Java导出数据到Excel文件

    Java导出数据到Excel文件需要的jar包:easypoi-0.1.3.jar, poi-3.7-20101029 package com.sais.inkaNet.reportStatistic ...

  8. java 从excel中读取数据_在Java中读取Excel文件的内容和导出数据到Excel文件中

    转自www.chianjavaworld.net 原作者:SonyMusic 读:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 在Java ...

  9. poi导出word与excel模版

    这里推荐一个比较好的poi导出word模版,http://m.blog.csdn.net/liushimiao0104/article/details/78520120 但需要注意的是导入的jar包, ...

最新文章

  1. Mac快速显示桌面快捷键
  2. Java进阶篇(六)——Swing程序设计(上)
  3. 为什么python打包的应用那么大_浅谈python3打包与拆包在函数的应用详解
  4. npm:can not find module 'xxx'
  5. 线程休眠 sleep
  6. 武汉学java_学习武汉Java开发想要找到工作,需要学到什么程度呢?
  7. 如何将vs2015中的英文注释改为中文
  8. scrcpy设置快捷键_推荐电脑高清晰同步Anroid屏幕软件Scrcpy
  9. JavaScript 函数定义和调用
  10. 2019美赛B题PSO算法
  11. 异常处理·psftp·local unable to open
  12. 软件测试面试必问问题
  13. 拉格朗日插值法总结模板(1~n)
  14. mysql 创建函数报错_MySQL 创建函数时报错'ERROR 1336 (0A000): Dynamic SQL'
  15. Kettle中关于多数据库链接报表或视图不存在的错误总结
  16. 20071020--高桥
  17. lisp不是函授型语言_LISP语言
  18. 没得选这件事是人生常态
  19. css中“zoom:1”是什么意思
  20. 结合stata和pyecharts对双11淘宝销量数据分析(进度5%,咯咯咯 我鸽了)

热门文章

  1. lqc_使用SNAT、DNAT策略实现网关应用
  2. 2017物联网安全事件盘点
  3. 关于C++传递数组时初始化注意事项(允悲)
  4. Ubuntu To Go,打造随身linux系统(支持uefi启动)。同样支持WinToGo或其他可通过镜像安装的系统
  5. 揭秘:微软高管为什么让测试工程师“吃狗粮”呢?
  6. 20、spring源码系列总结
  7. 关于机械臂仿真软件的简介
  8. 阿尔法系统时钟和外设时钟
  9. LayaAir使用总结
  10. 2022年中国半导体设备市场规模达到1728.41亿元,市场迎来新一轮上升周期