标签:JAVA admin 堆栈 线程 USER 进程 使用率 异常
1 前言导读
开发&测试人员在应用运行&测试过程中会遇到以下常见问题
- 在测试&调试过程中,应用会出现卡顿或接口响应失败问题,不知如何入手?
- 开发&测试人员在排查响应失败问题时发现CPU&内存异常性飙高,究竟是哪个进程?哪个线程?
- 针对进程&线程的异常资源使用,是否有具体的方法定位至代码层面,节约测试&开发时间?
一般遇到此类资源使用异常类问题,很多人会采取重新部署或重启应用的方式解决,其实并没有解决当前应用的真实痛点,如果后面调用量持续增长,当前操作并不会从根本上解决当前问题。
以下就是通过对物流客服中某个应用出现的异常资源使用率的分析,作为具体的操作实例,按照进程->线程->异常堆栈->代码 的逻辑过程,为各位提供参考。
2 整体思路
针对分析过程,参考如下的重要节点的逻辑过程图
3 分析过程
3.1 问题来源
开发在测试环境中调试代码时,发现应用basic-platform的CPU资源使用率一直处于700%左右,分析思路如下图所示
3.2 实例分析
步骤一:定位至进程
通过命令:top 查找出资源消耗异常的进程,如图所示,PID:21944
步骤二:打印异常堆栈
通过命令:jstack 21944 >/home/admin/ps.txt 将该异常进程对应的错误堆栈信息输入到文件ps.txt中
步骤三:定位至线程
通过命令:ps -mp 21944 -o THREAD,tid,time 查看当前进程21944 对应的线程数资源使用情况,并找出CPU使用率较高的线程号,如图所示
步骤四:异常堆栈日志搜索定位
选取使用率异常的线程号,并将线程号10进制的转为16进制,比如:31098 转为 797a,ps.txt堆栈文件中搜索16进制线程号797a,以上截图即为当前线程运行过程中,对应的异常堆栈信息
步骤五:通过异常信息定位代码
以上截图异常信息给开发或者自己有能力可以通过异常堆栈信息对应的代码行数来进行问题分析
通过步骤4中的前两行异常,可定位至代码文件中如下图所示处:递归中缺失if语句缺失对应的else导致
4 踩坑实录
4.1 hsperfdata_${USER}文件说明
jvm运行时会生成一个目录hsperfdata_USER(USER(USER是启动java进程的用户),在linux中默认是/tmp,目录下会有些 pid文件,存放jvm进程信息,而jmap,jstack等工具会读取/tmp/hsperfdata_$USER下的pid文件获取连接信息.---jstack的数据来源
4.2 使用Jstack过程遇到问题
- 命令行输入jps命令,出现process information unavailable
- 需要考虑原因两个
a. 监控的进程在/tmp/hsperfdata_${USER}目录下是否有对应的进程号
如图所示:
hsperfdata_root目录下文件为空
hsperfdata_admin目录下文件为当前进程21215
b. 解决方案:切换admin用户,然后执行jstack命令
c. 解决原因:当前进程号21215对应的Java进程,启动权限为admin用户,所以通过jstack监控的数据仅能在admin用户目录下看到
d. 也说明一个问题:通过Qone平台部署的Java应用,启动权限都为admin用户,在这里要注意手动启动权限与Qone保持一致
5 其他周边知识
标签:JAVA,admin,堆栈,线程,USER,进程,使用率,异常 来源: https://blog.csdn.net/fuqianming/article/details/119382299
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。