随着硬件的发展,往往服务器会配置足够的 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. Cell的一些坑: UITableViewCell宽度,在iphone5的时候是320,在iphone6的时候为啥也是320?

    在自定制cell'的.m文件里重写setframe方法就可以了- (void)setFrame:(CGRect)frame{    frame.size.width = [UIScreen mainS ...

  2. Windows Server 2008R2服务器安装及设置教程

    第一篇:系统安装与设置 前言本安装及设置教程适用于使用Windows2008R2为操作系统的服务器,目的是让服务器实现下列环境.语言脚本环境:ASP.ASP.Net1.1.ASP.Net2.0.ASP ...

  3. oracle拼接字符串

    参考:http://www.cnblogs.com/freeliver54/archive/2013/07/01/3165144.html

  4. Secretary Problem

    最好时机问题 n个值 前n/e都不选 然后取第一个大于前n/e个数中最大值的数 选中最大的概率为1/e

  5. Java语言的编写规范

    ,区别大小写.2,注意编程格式,比如对齐啊 什么的.3,注释一定要写好,有统一的// 或者/* */,这样让程序好看.4,定义变量的时候竟让别人看明白,不要A 啊B 啊什么的 要用英语单词这类的,简而 ...

  6. 三个 DAL 相关的Java代码小工具

    最近在做 DAL (Data Access Layer 数据访问层) 的服务化,发现有不少地方是人工编写比较繁琐的,因此写了几个小工具来完成. 1.  从 DAO 类自动生成 CoreService ...

  7. xml问题报错处理

    添加个classPath:/  保存下就能解决报错了  /后面要加个空格,最后一行尖括号里面不能有空格.

  8. python发送邮件方法

    1.普通文本邮件 #!/usr/bin/env python # -*- coding:utf-8 -*- import smtplib from email.mime.text import MIM ...

  9. Spring中@Controller和@RestController之间的区别

    1. Controller, RestController的共同点 都是用来表示Spring某个类的是否可以接收HTTP请求 2.  Controller, RestController的不同点 @C ...

  10. ie11媒体查询以及其他hack

    <!doctype html> <html> <head> <title>IE10/11 Media Query Test</title> ...