>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22622 个阅读者 刷新本主题
 * 贴子主题:  面试官问:如何排除Java虚拟机的GC引起的CPU飙高? 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-11-24 05:32:27     消息  查看  搜索  好友  邮件  复制  引用

   在工作中,当一个系统发生 OOM的时候,这种问题可能会让大家很烦恼困惑,因为故障排查起来是一个综合技术的考量。在平时工作中要增加自己的知识广度,多学习,多总结,多思考,多做笔记,这才是真正的王道。

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

尤其是在线上环境中,如何分析是哪个线程导致的CPU飙高的问题,通常大致有几个差不多固定的步骤。这个问题也是面试频率非常之高的问题之一,很多人也是靠回答这个问题而加薪。

常见套路步骤:
  使用top命令

使用

top -H pid

使用

prinf %x tid

使用

jsack pid >pid.log

查阅

less pid.log

下面就来说一下这几个步骤。

    top

我们可以使用top命令来查找对应使用CPU最多的进程,找到后,先记录下对应的pid(后面要用到)。

再使用Shift+P这两个快捷键可以按CPU的使用率进行排序。

    top-H pid

再次使用top名,但是这次增加一个参数-H,可以查看上面找出来的pid进程中对应的线程tid,记住这时候的线程tid得记住

    printf

但是此时的tid是十进制的,我们需要把这个tid转成16进制。然后使用    

printf %x tid

    stack

使用jstack工具把线程信息输出到对应的日志文件中,后面使用这个日志文件内容进行分析。    

jstack pid >pid.log

    less

上面已经生成日志文件了,这时候可以使用less命令来查找上面已经转换好的16进制的线程tid。    

less pid.log

       其它

另外还可以使用    

jstat -gcutil pid 1000 10

来查看垃圾回收的实时情况。


----------------------------
原文链接:https://blog.51cto.com/10983206/2552633

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-11-25 11:03:52 重新编辑]
  Java面向对象编程-->面向对象开发方法概述之UML语言(下)
  JavaWeb开发-->Web运作原理(Ⅰ)
  JSP与Hibernate开发-->JPA API的高级用法
  Java网络编程-->基于MVC和RMI的分布式应用
  精通Spring-->组合(Composition)API
  Vue3开发-->Vue组件开发高级技术
  Java函数式接口和Stream流
  Java设计模式: 里氏替换原则和合成复用原则详解
  十分钟带你搞懂 Java AQS 核心设计与实现!
  被迫重构代码,这次我干掉了 if-else
  Java设计模式中的工厂模式和策略模式范例
  64匹马,8个赛道,找出跑得最快的4匹马
  Java并发编程之验证volatile不能保证原子性
  volatile 与 synchronized 详解
  Java设计模式:组合模式
  Java Scoket之java.io.EOFException解决方案
  Java入门实用代码:修改链表LinkedList
  Java入门实用代码:删除链表中的元素
  Java入门实用代码:字符串优化测试
  jdbc连接各种数据库代码
  Java中用动态代理实现标准的DataSource数据源连接池
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。