随着硬件的发展,往往服务器会配置足够的 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. IntelliJ IDEA全文搜索很给力

  2. 如何使用Sitemap和menu创建网站导航

    1.添加Sitemap文件 将Sitemap内容替换为如下示例代码: <?xml version="1.0" encoding="utf-8" ?> ...

  3. 检测浏览器是否支持cookie方法

    cookie 摘自: http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html Cookie是什么? Cookie 是一小段文本信息 ...

  4. HTTPS与强制门户

    强制门户 http://www.whatis.com.cn/word_5182.htm 强制网络门户(captive portal)是一个Web页面,它是使用公共访问网络的用户在被授予访问权限前必须访 ...

  5. App Store有哪些原因会影响app应用上架呢?(分享)

    App Store对于应用上架的审核是非常严格的,很可能一个没有注意到的细节,或者一个你根本没想想到的原因就会导致你的应用上架失败.而排除这些无可避免的错误以外,还有一些导致应用上架失败的原因,非常常 ...

  6. Java基础之在窗口中绘图——移动曲线的控制点(CurveApplet 3 moving the control points)

    Applet程序. import javax.swing.*; import java.awt.*; import java.awt.geom.*; import javax.swing.event. ...

  7. C 宏定义 理解(1)

  8. IOS基础面试题

    最近离职了,找工作,光会做项目,对基础不熟,今天就总结了一点面试题. 废话不多说,上题吧: 1.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么. 基本类型和C一样,主要 ...

  9. 浙江理工2015.12校赛-B 七龙珠

    七龙珠 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 781 Solved: 329 Description 话说孙壕请吃了青岛大虾后,一下子变穷了,就 ...

  10. 自己写的java用jxl导出到excel工具

    package com; import java.io.BufferedOutputStream; import java.io.File; import java.io.IOException; i ...