前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试-线上故障如何排查

面试-线上故障如何排查

作者头像
小土豆Yuki
发布2022-12-01 21:11:35
4560
发布2022-12-01 21:11:35
举报
文章被收录于专栏:洁癖是一只狗洁癖是一只狗

面试经常会被问到java应用出现了问题,如何排查,主要使用下面几个命令基本都能解决

  1. 执行top命令,查看所有进程占用cpu的排序
  2. 执行top -Hp pid,查看java进程下的所有线程占用cpu的情况
  3. 执行printf '%x\n' pid,把pid转成16进制
  4. jstack pid|grep 线程id(即上一步的16进制),查看此线程的堆栈信息
  5. jmap -dump:format=b,file=filename pid,导出此进程的内存heap输出文件
  6. jstat -gcutil pid 统计间隔毫秒 统计次数

比如我们要查看cpu飙升的问题

我们再看看我运行的代码

代码语言:javascript
复制
public class test {
    public static void start() {
        ExecutorService pool = Executors.newFixedThreadPool();

        while (true) {
            pool.execute(() -> {
                double a = Math.random();
                double b = Math.random();
                int result = (int) (a + b);
            });
        }
    }
    public static void main(String[] args) {
        start();
    }
}

我们直接使用我们开头的几个命令

代码语言:javascript
复制
第一步执行top,找到占用内存高的进程id
代码语言:javascript
复制
第二打印进程的所有线程 top -Hp 2467
代码语言:javascript
复制
第三把对应占用高的线程转成16进制 printf '%x\n' 2469
代码语言:javascript
复制
第四打印对应线程的堆栈情况 jstack 2467| grep 915

以上基本就可以找到对应代码的问题,上面举例比较简单,实际可能比较复杂,但是基本上这几个命令都可以解决

导致CPU飙升常见的原因如下

  • 死循环或者超大循环,如我们的例子
  • 频繁创建对象发生 YGC,导致CPU占用飙升
  • 超多线程,线程调度的开销极大
  • 超大的运算
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洁癖是一只狗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档