随着硬件的发展,往往服务器会配置足够的 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 问题的更多相关文章

  1. Java Performance - 如何调查解决内存问题

    JVM 的内存溢出/不足/OutOfMemoryError/垃圾收集恶性循环是需要解决,又是屡见不鲜的问题. 建议阅读官方的 Troubleshooting Guide for Java SE 6 w ...

  2. 老李分享:《Java Performance》笔记1——性能分析基础 1

    老李分享:<Java Performance>笔记1——性能分析基础   1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ...

  3. Java Performance Optimization Tools and Techniques for Turbocharged Apps--reference

    Java Performance Optimization by: Pierre-Hugues Charbonneau reference:http://refcardz.dzone.com/refc ...

  4. zprofiler三板斧解决cpu占用率过高问题(转载)

    zprofiler三板斧解决cpu占用率过高问题 九居 JVM性能与调试平台   zprofiler   上周五碰到了一个线上机器cpu占用率过高的问题.问题本身比较简单,但是定位过程中动用了多个zp ...

  5. zprofiler三板斧解决cpu占用率过高问题

    zprofiler三板斧解决cpu占用率过高问题  九居 浏览 171 2015-04-08 14:11:58 发表于:JVM性能与调试平台   zprofiler   上周五碰到了一个线上机器cpu ...

  6. 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 ...

  7. 【Java并发编程】从CPU缓存模型到JMM来理解volatile关键字

    目录 并发编程三大特性 原子性 可见性 有序性 CPU缓存模型是什么 高速缓存为何出现? 缓存一致性问题 如何解决缓存不一致 JMM内存模型是什么 JMM的规定 Java对三大特性的保证 原子性 可见 ...

  8. 【转】java.lang.OutOfMemoryError: Java heap space的解决

    原文地址:http://blog.sina.com.cn/s/blog_4b12778b0100v0bb.html Myeclipse下java.lang.OutOfMemoryError: Java ...

  9. Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法

    Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法 java.lang.OutOfMemoryError: Java heap sp ...

随机推荐

  1. App 打包并跳过 AppStore 的发布下载

    一.App 打包 (编译 -> 链接 -> 打包) 1) 下载发布版的证书并安装. 2)Target -> Build Setting,改为发布版本的 profile 3) Targ ...

  2. LoadRunner,一个简单的例子

    一.录制脚本,这个就不说了,但是可以说说录完一个简单的脚本之后可以做的一些后续工作 1.设置事务的开始跟结束点(参考他人的http://www.cnblogs.com/fnng/archive/201 ...

  3. Android百分比布局支持库介绍——com.android.support:percent(转)

    转载自http://www.apkbus.com/forum.php?mod=viewthread&tid=244752&extra=&_dsign=0b699c42 在此之前 ...

  4. 使用paramiko模块远程登录并上传或下载文件

    1.paramiko安装 1)安装PyCrypto2.6 for Python 2.7 64bit.地址:http://www.voidspace.org.uk/python/modules.shtm ...

  5. Android 第三方开源下拉框:NiceSpinner

    Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Android原生提供的下拉框Spinner所提供的设计样式,而改用自定 ...

  6. Vcenter server 5.5克隆模板(创建ISO镜像)

    1.进入Vcenter server 5.5控制台 --- 选择虚拟机和模版. 2.右键 XP_32 --- 模版 ---- 克隆为模板(Vcenter server 5.5连接的VMware ESX ...

  7. paramiko模块,线程,进程

    关于paramiko模块 paramiko是基于Python实现的ssh2远程安全连接,支持认证及密钥方式远程执行命令.文件传输,中间ssh代理等 paramiko的安装: 安装好之后,用parami ...

  8. ios -- 教你如何轻松学习Swift语法(二)

    前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦.      一.可选类型(重点内容)   1.什么是可选类型?        1.1在OC开 ...

  9. PHP之十六个魔术方法详解

    https://segmentfault.com/a/1190000007250604#articleHeader14

  10. gulp详细入门教程(转载)

    本文转载自: gulp详细入门教程