Java Performance - 如何调查解决 CPU 问题
随着硬件的发展,往往服务器会配置足够的 CPUs, Java Server/服务器不太有 CPU 问题;但是偶尔因为 代码海量循环 或者 线程安全性(thread safe), 还是会带来 CPU 问题:
OS 现象:
- Windows 上面,发现 Java 进程CPU高,注意 Task Manager/ Resource Monitor 里面的 CPU 百分比是 所有 CPU 百分比;比如 16个 CPU, 如果看到 50%,表示用了 8 个 CPU。
- IBM AIX - 发现 Java 进程CPU高,注意 topas 里面的 CPU 百分比是 所有 CPU 百分比;比如 16个 CPU, 如果看到 50%,表示用了 8 个 CPU。
- Linux/Solaris - 注意 top 里面的 CPU 百分比是 单个 CPU 百分比;比如 16个 CPU, 如果使用了 8 个CPU,会看到 800%
常见问题以及诊断方法:
- 线程安全性(thread safe):
- 现象:CPU 持续很高,永不释放,而且会越来越高。
- 常见原因:比如 HashMap, 同时进行 put 引起损坏,然后后续的 get 也彻底陷入死循环
- 调查方法: jstack <pid> 抓取thread dump, 看到很多线程卡在 HashMap.get() / HashMap.put(); 需要修改代码比如通过 synchronized HashMap 的 put() 或者改用 ConcurrentHashMap
- 代码海量循环引起的 CPU 问题
- 使用 CPU Profiler/Sampler 调查:
jvisualvm 里面的 CPU Profiler
连到 JVM 后,到 Sampler, Click #CPU in the VisualVM and start your request; after complete the request, click #STOP in the VisaulVM
- 通过操作系统层面调查
- IBM AIX Java
1. topas 命令定位 CPU 使用高的进程,比如下面 PID 614852
Name PID CPU%
java
614852 23.9
java
450806 20.5
2.
使用命令
ps -mp <PID> -o THREAD 定位 CPU 使用高的线程 TID
比如下显示线程 (TID)11219165 消耗了 22% CPU. 把 11219165
换成 16 进制得到 AB30DD
ps
-mp 614852 -o THREAD
USER PID PPID
TID S CP PRI SC
WCHAN F TT
BND COMMAND
wc90 614852
581756 - A 222 60
49 *
242001 - - xxxxxxxxxxxx
- - - 4751559
R 20 95 1
- 400000 - - -
- - -
11219165 R 22 96 0
- 400000 - - -
3.
获得
javacore 文件
通过命令 kill
-3 <pid>, 比如 kill -3 614852
硬盘上 Java 工作目录 (一般是启动目录)会产生 javacore.20150507.163756.643532.0004
4.
搜索
TID, 比如
会得到线程的
Stack Trace, 然后可以定位消耗 CPU 的代码
- Java 在 Linux 或者 Solaris
1. 和上面类似,不过使用下面命令得到消耗 CPU 的 进程以及里面的线程
ps H -eo
user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu
Or
top -H -p <pid>
2. 使用下面命令抓取 进程 thread dump, 然后结合上面的 PID (需要换成 16 进制),在 thread dump 里面搜索就可以找到
Jstack <pid> > jstack.txt
Java Performance - 如何调查解决 CPU 问题的更多相关文章
- Java Performance - 如何调查解决内存问题
JVM 的内存溢出/不足/OutOfMemoryError/垃圾收集恶性循环是需要解决,又是屡见不鲜的问题. 建议阅读官方的 Troubleshooting Guide for Java SE 6 w ...
- 老李分享:《Java Performance》笔记1——性能分析基础 1
老李分享:<Java Performance>笔记1——性能分析基础 1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ...
- Java Performance Optimization Tools and Techniques for Turbocharged Apps--reference
Java Performance Optimization by: Pierre-Hugues Charbonneau reference:http://refcardz.dzone.com/refc ...
- zprofiler三板斧解决cpu占用率过高问题(转载)
zprofiler三板斧解决cpu占用率过高问题 九居 JVM性能与调试平台 zprofiler 上周五碰到了一个线上机器cpu占用率过高的问题.问题本身比较简单,但是定位过程中动用了多个zp ...
- zprofiler三板斧解决cpu占用率过高问题
zprofiler三板斧解决cpu占用率过高问题 九居 浏览 171 2015-04-08 14:11:58 发表于:JVM性能与调试平台 zprofiler 上周五碰到了一个线上机器cpu ...
- 7 Java Performance Metrics to Watch After a Major Release--转
原文地址:https://dzone.com/articles/7-java-performance-metrics-to-watch-after-a-major-1 The Java perform ...
- 【Java并发编程】从CPU缓存模型到JMM来理解volatile关键字
目录 并发编程三大特性 原子性 可见性 有序性 CPU缓存模型是什么 高速缓存为何出现? 缓存一致性问题 如何解决缓存不一致 JMM内存模型是什么 JMM的规定 Java对三大特性的保证 原子性 可见 ...
- 【转】java.lang.OutOfMemoryError: Java heap space的解决
原文地址:http://blog.sina.com.cn/s/blog_4b12778b0100v0bb.html Myeclipse下java.lang.OutOfMemoryError: Java ...
- Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法
Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法 java.lang.OutOfMemoryError: Java heap sp ...
随机推荐
- override与overload的区别
override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之 ...
- Node.js 使用 soap 模块请求 WebService 服务接口
项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 so ...
- 谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH
谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.ph ...
- 使用百度编辑器时,报错:从客户端("...)中检测到有潜在危险的 Request.Form 值
ajax请求失败,提交不上去 起初没找到报错的这句话,可能由于我用了其他第三方插件的原因,后来改动了一下,出现了这个错误 然后百度得到答案:http://www.cnblogs.com/tearer/ ...
- iis 重新注册 .net 方法
dhl:IIS注册ASP.NET 1.1.2.0.4.0_在win7下如果先安装vs2010 后安装iis7的话,必须注册iis才可以用.~~~!!鄙视微软 IIS中ASP.NET的版本号此时可选 ...
- react input 获取/失去焦点
<div className={ this.state.focus ? "dis_bottom_left_onfocus" : "dis_bottom_left&q ...
- [技术分享] .NET下 , 上传图片的处理方式 , 贴上代码 .
如题 , 直接上单代码 , AC代码 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8" ...
- Web应用程序项目以配置使用IIS。未找到Web服务器
解决办法 右键编辑该Web项目的csproj文件 把UserIIS改为False.或者在IIS服务器里面配置一个IISUrl里面的地址 如图
- HTTP中Get与Post的区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认 为:一个URL地址,它用于描述一个网络上的资源,而HTT ...
- 多张图片,限制大小,格式.md
//判断图片大小和后缀 两张身份证照片大小 ```javascript $(".js_upFile").on("change",function(){ ...