程序死循环、死锁问题定位

在开发过程中,可能由于代码设计问题导致出现了死循环或者死锁的问题,使服务器CPU负载飙高从而导致系统运行缓慢,因此要特别注意防止死循环和死锁的发生。如监控服务器状态时,如果发现CPU负载或利用率飙得很高,这时候就要定位出可能出现的问题,这是在开发中非常重要的能力之一。
主要方法:top 、jstack

定位死循环

  • 模拟一段死循环代码(我这里参考了其他博客的代码来做实验–链接)

  • 打jar包上传到Linux服务端(usr/local/jar)

mvn clean package -Dmaven.test.skip
  • 运行jar包
nohup java -jar monitor_tuning-0.0.1-SNAPSHOT.jar &
  • 访问死循环方法对应的url地址执行死循环代码,top查看运行的jar的进程ID


可以看到负载和cpu利用率都飙得很高

  • 问题排查,实验jstack获取对应进程的线程堆栈信息,下载到本地查看
jstack 108196 >108196.txt
rz 108196.txt
  • top -p 108196 -H 查看进程中cpu利用率最高的线程ID记录下来在jstack导出的文件中查看对应信息
  • 使用printf "%x" 108262 转化为16进制然后在jstack导出的文件中查找对应线程ID的信息

  • 通过在jstack导出的文件中查看这个线程的方法栈信息可以确定到运行的方法,定位到问题所在,分析代码是否出现了死循环或者是其他原因。

定位死锁

  • 模拟一段死锁代码
/*** 死锁* */@RequestMapping("/deadlock")public String deadlock(){new Thread(()->{synchronized(lock1) {try {Thread.sleep(1000);}catch(Exception e) {}synchronized(lock2) {System.out.println("Thread1 over");}}}) .start();new Thread(()->{synchronized(lock2) {try {Thread.sleep(1000);}catch(Exception e) {}synchronized(lock1) {System.out.println("Thread2 over");}}}) .start();return "deadlock";}
  • 访问该路径执行这段代码
  • jps查看对应java进程信息
  • jstack 109176 > 109176.txt将其导出并sz到本地查看

    可以看到jstack导出的文件记录了死锁,并将发生死锁的两个线程的详细信息记录下来,很清除的就能定位到死锁的位置,很好很强大!

总结:

当发现服务器CPU负载利用率很高时,分析可能出现了死循环或者死锁,通过工具来分析定位问题所在。
死循环:
1、用top查看cpu利用率最高的进程,并用jstack将其进程信息文件导出,
2、用top -p pid -H 查看进程中cpu占用率高的线程,在jstack文件中查询该线程的方法栈信息以定位到问题代码。
死锁:
1、jstack导出进程信息后,查看出现死锁的线程,
2、定位线程中出现死锁的方法,重新设计该段代码排除掉死锁。

补充:导致CPU负载变高的还有其他的原因如频繁的磁盘IO导致进程阻塞,导致CPU利用率飙高的原因也有可能是频繁的GC,具体问题具体解决,都可以使用工具来定位到问题所在。

程序死循环、死锁问题定位相关推荐

  1. 微信小程序:获取地理定位和显示相应的城市名称。

    最近在看微信小程序,遇到地理定位显示城市名称的问题.本文就是记录这一过程. 解决方案                                                          ...

  2. api 定位 微信小程序 精度_聊聊微信小程序内置地图定位的精确性

    前段时间,一个客户说到,我们给做的 菜齐了小程序 商家定位的地图不准确!用户想要去小程序指定的商家,从微信地图入口导航到所需要的地点差了有上百米! 上百米,这距离可够地远的,这怎么可能啊?我们一一查看 ...

  3. 企业微信小程序_获取准确定位的方法及解决定位不准确的问题

    文章目录 一.经验分享 1. 微信api现状 2. 解决方案 3. 适用场景 二.小程序集成腾讯定位服务 2.1. 注册腾讯开发者 2.2. 创建应用 2.3. 添加key 2.4. 下载sdk 2. ...

  4. 微信小程序_map组件实现定位

    微信小程序_map组件实现定位 map组件 这是官方提供的地图组件,很多复杂的功能我暂时没有接触到,而且有的效果似乎只有企业可以使用.我在这里就简单的实现一下map组件的定位用户的位置的功能. 下面的 ...

  5. 程序员该如何定位?看这四大方向

    宽泛的意义上讲,程序员是这样一群人:他们用某种语言或技术,开发某种软件产品(系统),解决特定现实领域的问题. 有了这个定义,我们就可以来讨论程序员的几种常见定位: 解决某类问题的专业人士 软件架构与设 ...

  6. DOS死机客星,能打破程序死循环,按住Ctrl +Esc即可使死掉的程序立即返回到Dos Shell

    //--DOS死机客星,能打破程序死循环,按住Ctrl +Esc即可使死掉的程序立即返回到Dos Shell code segment assume cs:code,ds:code org 100h ...

  7. Android Native程序crash的一些定位方法简介

    Android Native程序crash的一些定位方法简介 经常,避免不了,我们的代码会崩溃.如果crash在native代码上,Android会和其他Linux一样,生成一份core dump,将 ...

  8. 程序员自己的定位以及怪物追踪寻路AI (转)

    先从程序员的思想定位开始.程序员是什么,其实我们不是什么高深摸测的数学家,能使用多少种算法,能把计算机玩得那么厉害,其实程序的本质就是一个翻译者,是一个将人类的行为描述成计算机语言的翻译者.在这个解释 ...

  9. 微信小程序调用高德api定位当前经纬度,根据城市名获取对应经纬度

    最近写小程序有一个首页关于定位功能,指定高德API,话不多说,上图: 首先小程序需要先设置定位提示语,在mainfest.json中添加配置scope.userLocation: "mp-w ...

  10. 开源一个基于微信小程序的蓝牙室内定位软件(附下载链接)

    文章目录 1. 运行环境要求 2. 软件功能及程序说明 2.1 软件组成 2.2 主要功能 2.3 文件及函数功能说明 3. 软件设计及操作说明 4. 完整版代码获取 1. 运行环境要求 软件运行环境 ...

最新文章

  1. Scrapy学习篇(九)之文件与图片下载
  2. redis学习(七)jedis客户端
  3. 环形数组最大子数组之和
  4. linux which命令的使用示例
  5. HDU 1042 N!
  6. android 透明状态栏方法及其适配键盘上推(一)
  7. oracle两表,有什么方法对Oracle两张表的数据比较呢?
  8. 经纬度转换,度转度分秒,度分秒转为度,前端js
  9. 5.3 - 抽屉新热榜
  10. 零预算也能用SEO技巧达到Google自然搜寻结果第1名
  11. 一点接入全网互通,企业上云就用它!
  12. c语言操作符的自我总结hhhhhhhhh
  13. 环信java,java集成环信 - IM Geek开发者社区-移动开发者社区-开源社区-IM Geek官网...
  14. 移动流量转赠给好友_中国移动怎样转赠手机流量?月结流量用不完怎办
  15. (邱维声)高等代数课程笔记:基,维数与坐标
  16. 能耗指标与数据中心规模-孙长青
  17. 圣人、君子、小人、庸人的划分标准
  18. [论文评析]基于人体姿态识别的立定跳远 动作智能评估系统
  19. 移动端 transition动画函数的封装(仿Zepto)以及 requestAnimationFrame动画函数封装(仿jQuery)...
  20. 专注力的重要性和提高的方法

热门文章

  1. python读取crl吊销列表
  2. DOS命令之cls:清屏
  3. Python的高级图像处理
  4. Android 获取本地音乐生成对象,获取对应audio文件中的专辑图片
  5. 【后量子密码】CRYSTALS-KYBER 算法(一):MLWE 问题与NTT(附源码分析)
  6. 曝光SEO高手藏在内心的SEO秘籍
  7. 3月6日云栖精选夜读 | 三七女生节,解密阿里女程序员们的代码诗!...
  8. 实验:工具类 God【 3.1.2 抽象依赖原则的使能工具】
  9. TZOJ5942: 山区建小学(二维dp+枚举)
  10. 小飞鱼通达二开 为流程中心数据选择控件增加数据源(图文)