Linux下Java线程具体监控和其dump的分析使用----分析Java性能瓶颈[张振华-Jack]
这里对linux下、sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结;
top -p
12377 -H】 查看java进程的有哪些线程的执行情况。- 先用top命令找出占用资源厉害的java进程id,如图:# top
- 如上图所看到的。java的进程id为'52554',接下来用top命令单独对这个进程中的全部线程作监视:
- 先用top命令找出占用资源厉害的java进程id,如图:# top
1top-p
52554 -H
# top视图里面里面能够通过快捷键依次b ,x高亮显示top的列找出须要的线程。默认CPU排序,Shift+< ,Shift+>能够左右移动高亮排序的列;如图:(这时就看出来哪个java线程CPU高。哪个线程内存用的多)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGlhbnlhODQ2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
- 如上图所看到的,linux下,全部的java内部线程,事实上都相应了一个进程id,也就是说,linux上的sun jvm将java程序中的线程映射为了操作系统进程;我们看到。占用CPU资源最高的那个进程id是'15417',这个进程id相应java线程信息中的'nid'('n' stands for 'native');
- (1)要想找到究竟是哪段详细的代码占用了如此多的资源,先使用jstack打出当前栈信息到一个文件中, 比方stack.log:
1jstack
52554 > stack.log然后使用'jtgrep'脚本把这个进程号为'9757'的java线程在stack.log中抓出来:
1jtgrep
9757 stack.logwatermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGlhbnlhODQ2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" height="47" width="685" style="">
当中,'jtgrep'是自己随便写的一个shell脚本:
1#!/bin/sh3nid=`python
-c"print
hex($1)"`4grep-i
$nid $2道理非常easy,就是把'9757'转换成16进制后,直接grep stack.log;能够看到,被grep出的那个线程的nid=0x3c39。正好是15417的16进制表示。
(2) 通过(windows程序-->计算器),选择程序猿计算器将进程ID转换成16进制 到dump里面的nid 就能够搜索到"http-nio-8080-exec-25" daemon prio=10 tid=0x00007f69686b4800 nid=0x1ce5 waiting on condition [0x00007f698e7cf000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x0000000777063ec8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(Unknown Source)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGlhbnlhODQ2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Linux下Java线程具体监控和其dump的分析使用----分析Java性能瓶颈[张振华-Jack]的更多相关文章
- Java线程详细监控和其dump的分析使用—-分析Java性能瓶颈
转载:https://www.cnblogs.com/firstdream/p/8109352.html 这里对linux下.sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结: l ...
- 基于 JVMTI 实现 Java 线程的监控(转)
随着多核 CPU 的日益普及,越来越多的 Java 应用程序使用多线程并行计算来充分发挥整个系统的性能.多线程的使用也给应用程序开发人员带来了巨大的挑战,不正确地使用多线程可能造成线程死锁或资源竞争, ...
- Linux下查看线程数的几种方法汇总
Linux下查看线程数的几种方法汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux下查看某个进程的线程数量 pstree命令以树状图显示进程间的关系(display ...
- linux下使用crontab实现定时PHP计划任务失败的原因分析
这篇文章主要介绍了linux下使用crontab实现定时PHP计划任务失败的原因分析,需要的朋友可以参考下 很多人在linux下使用crontab实现PHP执行定时任务却未能成功,不能生成缓存.本 ...
- linux下日志文件error监控报警脚本分享
即对日志文件中的error进行监控,当日志文件中出现error关键字时,即可报警!(grep -i error 不区分大小写进行搜索"error"关键字,但是会将包含error大小 ...
- 对linux下日志文件error监控
对日志文件中的error进行监控,当日志文件中出现error关键字时,就截取日志(grep -i error 不区分大小写进行搜索"error"关键字,但是会将包含error大小写 ...
- Linux下进程线程,Nignx与php-fpm的进程线程方式
1.进程与线程区别 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流, ...
- java线程池监控
原因 最近在完善公司的基础发布平台的时候,使用到了一线程去做一些异步的事情,在开发环境和测试环境验证没有任何问题,但是在程序在生产运行一段时间后,发现没有得到自己想要的结果,为此开始了漫长的排查bug ...
- Linux下TCP延迟确认(Delayed Ack)机制导致的时延问题分析
版权声明:本文由潘安群原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/105 来源:腾云阁 https://www.qclo ...
随机推荐
- Git——github基本操作
基本概念 上一篇文章写到git共享仓库,但是有个局限性,就是这个仓库存在于本地,其他人无法从我们这个仓库拿到共享的内容 但是我们可以将这个共享仓库放入一个远程的服务器上,然后设置一些登录权限就能完美的 ...
- 328.io流(字符串-练习-复制文本文件一)
public static void main(String[] args) { // TODO Auto-generated method stub FileReader fr = null; Fi ...
- HiveServer2后台运行
nohup hive --service hiveserver2 & 或者直接: nohup hiveserver2 &
- 用 webpack 实现持久化缓存
什么是持久化缓存? 原文链接https://sebastianblade.com/using-webpack-to-achieve-long-term-cache/ 缓存(cache)一直是前端性能优 ...
- 更新dell机器的idrac的固件版本后重启机器系统失败
事情是这样的.dell ra620机器,idrac7打不开java,所以在机器生产中直接更新了固件,客户直接在系统内reboot后就连不上.打开本地是卡在下图. 强制重启后发现服务器提示,是IDRAC ...
- CAD绘制自定义实体(com接口)
在cad使用过程中,用户可以绘制自定义实体.点击此处下载演示实例. 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private ...
- 01C++编辑编译运行环境
C++编辑编译运行环境 Bloodshed Dev-C++ Microsoft Visual Studio
- Linux常用命令——帮助命令
1.帮助命令:man man 命令 获取指定命令的帮助 [dmtsai@study ~]$ man date DATE (1) User Commands DATE(1) #注意这个(1),代表的是m ...
- 巧用TWaver 3D 矢量图形功能
的确,提起TWaver,大家想到的首先是“电信拓扑图组件”.其实,由于其灵活的MVC架构.矢量化设计.方便定制等特点,TWaver可以做的还有很多.例如房地产行业常见到的“户型图”. 户型推荐是销售接 ...
- C++中重载,重写,隐藏的区别
重载: 重载是指在同一个作用域下,函数的函数名相同,但是函数参数的个数,或者参数的类型,参数的顺序不同.这时函数之间就构成了重载关系,这里需要注意的是,如果函数的参数列表完全相同,仅仅是返回值类型不同 ...