关于JVM CPU资源占用过高的问题排查

一、背景:

    先执行一个java程序里面开了两个线程分别都在while循环做打印操作。

# java -cp ./test-threads.jar com.spiro.Main

二、现象:

    通过top命令查看当前CPU情况

    可以看到有个java进程占用CPU过高,下面来排查是什么线程的什么代码导致CPU过高。

三、步骤

    先获得PID为2023,上图可以看到,或者通过jps命令获取。 执行以下命令:   

# top -H -p2023

说明: -H 指显示线程,-p 是指定进程

    结果:

    可以看到两个CPU占用较高的线程,记下PID 2033和2034 ( 此处的PID即为线程ID标识) ,将其从十进制转成十六进制表示,可通过windows自带的计算器来转。得到结果分别为7f1和7f2

    再通过jstack命令获取当前线程栈,可暂时保存到一个文件tempfile.txt中;  

# jstack -l 2023 > tempfile.txt

在tempfile.txt中查找nid=0x7f1的线程:

    可以看到我们找到的线程Thread-0,以及该线程的状态和正在执行的代码行,本例中显示当前正在执行Worker类的15行。然后可去代码中查看不合理的逻辑

四、总结

    该方法很有用,多次使用该方法定位出程序中的性能问题,在此分享和记录。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构师历程

windows下出现mysql启动出现 ‘发生系统错误’ 1067

今天在windows下安装mysql,在启动时出现了发生‘系统错误 1067’的错误。

1.4K40
来自专栏coder修行路

关于go语言的测试相关内容笔记

其实之前对于测试自己一直比较弱,不管是python的还是go的,关于测试这块并没有非常注重,这次就好好整理一下关于go的测试

8710
来自专栏用户2442861的专栏

linux工作中常用文件操作命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

27720
来自专栏开源优测

python selenium - 利用excel实现参数化

前言 在进行软件测试或设计自动化测试框架时,一个比可避免的过程就是: 参数化,在利用python进行自动化测试开发时,通常会使用excel来做数据管理,利用xl...

30180
来自专栏JetpropelledSnake

Python中模块(Module)和包(Package)的区别

1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。 为了编写可维护的代码,我们把很多...

493110
来自专栏深度学习之tensorflow实战篇

交互式使用 R题(shell)

交互式使用 R 交互式shell是一种很方便的环境,可以进行各种尝试,随时调整过程。与Python、Ruby等语言一样,R也提供了shell环境。本文开始的例子...

31450
来自专栏程序员宝库

Linux 基础:文件查找 find

在linux的日常管理中,find的使用频率很高,熟练掌握对提高工作效率很有帮助。 find的语法比较简单,常用参数的就那么几个,比如 -name、 -type...

385130
来自专栏编程微刊

微信小程序从零开始开发步骤(七)引入外部js 文件

26240
来自专栏我是攻城师

关于线程死锁问题

死锁是多线程编程里面非常常见的一个问题,作为一个中高级开发者是必须掌握的内容,今天我们来学习一下死锁相关的知识。

13360
来自专栏yukong的小专栏

【ssm个人博客项目实战06】博客类别的添加修改删除的实现1、博客类别service层完善3、博客类别管理界面功能完善1、功能实现

在前面两篇博客中我们分别实现了在dao层的博客类别的增删改查已经分页,以及在后台管理系统界面中的博客类别的分页显示,那么现在我就要准备实现了在后台管理界面的博客...

23860

扫码关注云+社区

领取腾讯云代金券