美文网首页程序员
我故意写了个死循环

我故意写了个死循环

作者: 翟志军 | 来源:发表于2017-02-17 12:03 被阅读833次

转载请注明转自:https://showme.codes/2017-02-17/endless-loop-cpu100/

导致CPU100%的原因很多,而程序中出现死循环就是原因之一。然而,并不是每个人在工作中都有机会踩中这个坑。我就是其中一个没踩过的。人生似乎有些不完整。

所以,我做了一个很重要的决定:在程序中写一个死循环。看看会发生什么事情

当然,不是在生产环境。😜 我搭建了一个实验环境来做实验。只是这个实验环境不仅可以用于这个死循环实验。以下是这个环境的结构图:

实验室结构

还是老样子,使用Vagrant + Virtualbox + Ansible自动化搭环境。代码及搭建步骤在文末。

我们会写一个简单的Spring MVC 应用,然后其中一个接口里会有死循环代码:

    @RequestMapping(value = "/loop", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
    public void endlessLoop() {
        int i = 0;
        while (true) {
            System.out.println(i += 1);
        }
    }

以下是我自己尝试找出这个死循环的过程。

使用top,查看是哪个进程的问题

我请求一次:http://192.168.88.10:9898/web/loop

07:13:36 cpu100%了

然后,我打开新窗口,又请求一次

07:22:28 CPU120%~130%之间

这里,我好奇CPU没有到200%。一直在120%和130%之间。P.S. 我一定是某个知识点不牢固,要不,不会有这个疑问。

堆空间

因为不涉及JVM堆空间问题,执行 jstat -gcutil 32593 1s 没看出什么问题。32593为Java进程ID,1s指1秒抽样一次。

查看堆空间GC情况

堆没问题,就看看是哪个线程占用得高。

  1. 列出java进程的线程,top -H -p <java 进程pid>

    找到CPU占用高的线程PID
  2. 将jvm的栈dump下来
    jstack -l <其中一个线程PID> >> stack.log,这里我选3596。

  3. 在日志中,找到相应的线程
    我们需要从栈日志中找到相应的线程,但由于栈日志中使用的16进制,但是top中的PID又是10进制,所以,需要手工将10进制的PID转成16进制。3596的16进制转是0xe0c


    less stack.log 然后搜0xe0c

小结

好吧。我没有因为写这个死循环去看10小时的无聊电影。

附录:

  • 代码:performance-labs
  • 准备环境:虚拟机的账号密码都是vagrant
    • git clone git@github.com:zacker330/performance-labs.git
    • vagrant up
    • download jdk8 to ansible/roles/jdk8/files: https://pan.baidu.com/s/1bpxfpvD
    • ansible-playbook ./ansible/playbook.yml -i ./ansible/inventory -u vagrant -k
    • ansible-playbook ./ansible/init-mysql.yml -i ./ansible/inventory -u vagrant -k
    • cd ansible;chmode +x ./buildwarfile.sh;./buildwarfile.sh --> 将会提示输入vagrant密码
  • 访问:http://192.168.88.10:9898/web/

相关文章

  • 我故意写了个死循环

    导致CPU100%的原因很多,而程序中出现死循环就是原因之一。然而,并不是每个人在工作中都有机会踩中这个坑。我就是...

  • 我故意写了个死循环

    转载请注明转自:https://showme.codes/2017-02-17/endless-loop-cpu1...

  • 1024程序员节这天,我故意写了个死循环~

    导致CPU100%的原因很多,而程序中出现死循环就是原因之一。然而,并不是每个人在工作中都有机会踩中这个坑。我就是...

  • 拯救你的nodeMCU,死循环的解除方法

    我觉得吧,每个玩nodeMCU的同学都应该见过这种场景,在init.lua中写了一个死循环(不单指for循环那种,...

  • java性能分析工具--yourkit使用教程

    1.内存消耗: 写了一个死循环的测试程序, yourkit监控如下: 点击进去,能诊断问题代码具体的方法: 2.死...

  • 《办公室恩仇记 》目录-更新中

    (1)生活陷入无解的死循环 (2)世道变了 (3)他在故意冷淡 (4)到底是什么事让他发生了变化呢 (5}他不想再...

  • 对象数组的重复项整理

    首先定义一个实体类Person, 两个属性编号和姓名. 然后给person数组赋值,这里我故意写了几个重复数据。 ...

  • 2019年4月30日

    今天听了陈校长的话,觉得这是个不错的办法,虽然我没有很多时间,不过,我要试试!不过我故意写了个错别字,他没看出来,...

  • 时间

    今天晚上,我用三个小时写了个读书笔记,妈妈对我大发雷霆,认为我是故意拖延时间。 其实我是写读书笔记...

  • 只要每天进步一点点就好!

    过去的我,自己走入死循环之后,就找各种方法,想立马走出死循环。所以,吸引来一个个方法,让我尝试,最后还是没有走出死...

网友评论

    本文标题:我故意写了个死循环

    本文链接:https://www.haomeiwen.com/subject/qkskwttx.html