Java线程堆栈

  • Linux jstack命令
jstack 7756(Java进程号) > java.stack
  • Linux kill命令
kill -3 7756(Java进程号)

向JVM发送QUIT信号 

Java线程

  • JVM创建线程

  • 用户线程
main函数代表主线程
  • 线程堆栈的第一行

1、java线程转换LINUX 内核库pthread即本地线程2、tid 语言层面的id比如Java 线程编号3、nid(Native Thread)运行在操作系统基础上的本地id
  • 线程调用含义

堆栈信息其中一行的调用关系


  • pstatck 7756(Java进程号)
nid(16进制) == LWP(10进制)

16进制的nid


10进制的LWP(轻量级进程)


锁是否释放

  • wait() 会释放监视锁

  • sleep会占用锁

  • 当一个线程占有一个锁时
堆栈会打印 -locked <Oxe7402c48>
  • 当该线程等待别的线程释放该锁
堆栈会打印 -waiting to lock <Oxe7402c48>
  • 如果代码中有wait调用
首先是locked 然后又会打印 waiting on <Oxe7402c48>这种会导致死锁即死循环 占用了锁等待其他锁

线程死锁


0时刻 线程0获取锁0 线程1获取锁1 2时刻 线程0获取锁1 线程1获取锁0 两个线程各得到锁 都等待对方的锁

Java堆栈直接给出死锁的结果

死锁报错


死锁详情


死锁情况分析导致CPU过高分析

方法1

步骤


为什么要去掉wait和sleep的线程 因为其不占用cpu资源

原因


方法2 TOP&堆栈方法(一次命中)


JNI是Java Native Interface

5578是java的进程号打印这个进程中所有线程cpu消耗倒叙排列 shit+hjstack把线程堆栈打印出来 里面有很多线程 其中有一个就等于cpu消耗最多的那个pid就可以直接定位到这行代码有问题

不消耗CPU的线程状态

  • JVM的RUNNABLE状态
网络IO不消耗CPU 是同步阻塞的过程
  • TIMED_WAITING(on object monitor)
obj.wait(time)
  • TIMED_WAITING(sleeping)
Thread.sleep(time)
  • TIMED_WAITING(parking)
被挂起
  • WAITING(on object monitor)
obj.wait()通过notify()唤醒
  • BLOCKED (on object monitor)
等待监视锁
  • WAITING(parking)
被挂起

Java线程堆栈

  • 一次线程堆栈信息

  • 多次线程堆栈

资源不足导致性能下降原因

大量线程停在同样的调用上下文中

原因


未及时释放连接的情况


多个锁导致的锁链分析

很多线程在等待不同的锁 有的锁竞争可能由于另外一个锁对象竞争导致 需要找到根源

案例分析


WebAPI性能瓶颈

线上表现

1、连接阻塞比较多RECQ(接收的队列)2、超时日志疯狂打印3、通过重启webapi进程临时缓解压力

解决步骤


线程A


线程B


线上故障处理方式

  • 保留现场
比如通过jstack保存堆栈快照信息
  • 恢复服务
第一时间恢复服务 比如restart、reboot
  • 排查解决
  • 验证

常规操作

  • 重启
  • 回滚
  • 降级
  • 摘机

现象收集&故障定位


潜在bug被激发的情况重启有效

故障排除&服务恢复


确定服务进程排查问题


CPU

top shift+p 按pid 进程编号升序shift+m 按占用内存大小降序

内存

free -g

内存

vmstat -n

tcp连接数量

netstat -aonp|grep tcp |wc -l

端口映射

netstat -natp|sort -m

磁盘情况

iostat -d 1

文件占用情况

ls -l /proc/*/fd

目标服务内观察


问题协查方法论


异常处理原则

错误永远无法避免 且发生的角度永远无法预期在故障发生时尽可能维持系统核心功能的可用性

线上故障快速定位及恢复相关推荐

  1. 线上故障如何快速排查?来看这套技巧大全

    简介:有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服务器.Java应用.数据库.Redis.网络和业务六个层面分享线上故障排查的思路和技巧.较长,同学们可收藏后再看. 前言 线 ...

  2. idea本地跑如何看gc日志_线上故障如何快速排查?来看这套技巧大全

    简介:有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服务器.Java应用.数据库.Redis.网络和业务六个层面分享线上故障排查的思路和技巧.较长,同学们可收藏后再看. 前言 线 ...

  3. du -sh 如何找到最大的文件夹_线上故障如何快速排查?来看这套技巧大全

    简介:有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服务器.Java应用.数据库.Redis.网络和业务六个层面分享线上故障排查的思路和技巧.较长,同学们可收藏后再看. 前言 线 ...

  4. 阿里技术:如何快速排查线上故障?

    阿里技术:如何快速排查线上故障? 以下文章来源于阿里技术 ,作者小峯 阿里技术 阿里巴巴官方技术号,关于阿里的技术创新均呈现于此. 有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从 ...

  5. 软件工程之美学习笔记三十八 37 | 遇到线上故障,你和高手的差距在哪里?

    <软件工作之美>材料地址:https://time.geekbang.org/column/article/97219 遇到线上故障,新手和高手的差距在哪里? 新手遇到复杂的线上故障,不知 ...

  6. 牛掰!救火必备:线上故障排查套路大全

    点击上方"民工哥技术之路",选择"设为星标" 回复"1024"获取独家整理的学习资料! 线上故障主要会包括cpu.磁盘.内存以及网络问题,而 ...

  7. JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数 ...

  8. JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:fredal https://fredal.xin/java ...

  9. JAVA 线上故障排查完整套路!牛掰!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源丨8rr.co/kV3R 线上故障主要会包括 CPU.磁盘.内 ...

最新文章

  1. lambda dict sort
  2. 微控制器和微处理器的区别
  3. 有米android sdk,有米积分墙Android SDK开发者常见问题
  4. C/C++之 C++ String(字符串)
  5. c语言某一行不被优化,C语言优化小技巧
  6. 什么是物理路径,相对路径,绝对路径以及根目录
  7. 【Android】关于参数的传递问题
  8. 【P1714】切蛋糕(单调队列)
  9. python编程是啥-学了Python编程之后,同是新手的他们做了什么?
  10. 赛尔译文 | 基础模型的机遇与风险 (四)
  11. PowerShell 远程连接与其它技巧
  12. 0308·付费专栏销售排行榜
  13. UiBot进行谷歌浏览器长截屏办法
  14. 由对称性知定点一定在x轴上_圆锥曲线中的定点定值问题的四种模型.doc
  15. 算法题目打卡:Ques20201012
  16. Pluralistic Image Completion—多元图像补全—摘要翻译—测试教程(附源码)——CVPR 2019
  17. 虾皮「光速大裁员」:7分钟大会后,软件瞬间查无此人
  18. excel中插入图表改变横纵坐标问题
  19. C++-点到点、点到线、共线等常用计算
  20. 小白MacBook超级实战教程——装双系统WIN10

热门文章

  1. java面试题2021最新
  2. 金蝶k3rpc服务器不可用_金蝶KIS商贸版常见问题这样解决
  3. 实战HTML5与CSS3 第一篇】初探水深,美丽的导航,绚丽的图片爆炸!!
  4. windows下常用DOS命令
  5. 资料汇总--java开发程序员必备技能
  6. iOS开发 - StoryBoard + UIScrollView + UIView
  7. 专题实验 字符集(全球化支持)
  8. VirtualBox桥接网络的简单配置,让虚拟机直接访问网络
  9. 统计图学习-类型介绍
  10. MOSS 2007 系列学习之安装篇(一)