java程序CPU消耗分析之找出最耗CPU线程

java程序CPU消耗过高一般有两种情况:

1、
us过高,应用占用CPU资源过高,需找出具体占用CPU的线程所执行的代码,分析定位问题原因。

分析步骤如下:

(1) 使用top命令找出占用cpu最高的JAVA进程

(2) 找出占用cpu最高的线程 
top -Hp 1781

(3) 占CPU最高线程17596换算成16进制对应线程44bc

用命令

printf "%x\n" 17596

(4) 打印占CPU最高JAVA进程1781的堆栈信息

jstack
1781> stackdump.txt

代码如下:

public class CPUConsumeTest {

public static void main(String[] args) {

int count = Runtime.getRuntime().availableProcessors();

System.out.println("processors " + count);

for(int i=0; i<count; i++) {

new Thread(new ConsumeCPUTest()).start();

}

for(int i=0; i<100; i++) {

new Thread(new NotConsumeCPUTest()).start();

}

}

}

class ConsumeCPUTest implements Runnable {

public void run() {

while(true) {

for(int i=0; i<10000000; i++) {

long l = 1000000;

Math.acos(l);

}

try {

Thread.currentThread().sleep(20);

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

}

}

}

class NotConsumeCPUTest implements Runnable {

public void run() {

while(true) {

try {

Thread.currentThread().sleep(50);

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

}

}

}

2、sy过高,上下文切换过频繁,将线程栈打印出来,看是否有哪个锁竞争过于激烈

时间: 2024-10-29 02:41:44

java程序CPU消耗分析之找出最耗CPU线程的相关文章

JVM调优之jstack找出最耗cpu的线程并定位代码

一.jstack使用总结 分析java进程,cpu占用高的问题 { 1.找到cpu占用高的进程pid 在top中,按组合键: shift + h ,会按cpu使用从高到低排序2.找到cpu占用高的线程pid top -Hp cpu高的进程pid, shift +h 查找最高线程,显示线程3.jstack 进程的pid | grep -A 线程pid的十六进制 #分析Java应用程序线程堆栈dump出来 printf "%x\n" cpu高的线程pid ==> 得到十六进制 pyt

Linux环境下的CPU消耗分析

在Linux系统中, CPU 主要用于中断,内核以及用户进程的任务处理,优先级为 中断 > 内核 > 用户进程.在CPU消耗分析中,我们还经常遇到下面几个概念. 上下文切换         每个CPU在同一时间只能执行一个线程, Linux 中线程是抢占式调度的. 也就是说每个线程分配一定的执行时间,当到达执行时间,线程中有IO阻塞或者高优先级线程要执行时,Linux将切换执行的线程,在切换时要存储目前线程的的执行状态,并恢复要执行的线程的状态,这个过程就称为上下文切换.在java 应用程序中

当cpu飙升时,找出php中可能有问题的代码行

当你发现一个平时占用cpu比较少的进程突然间占用cpu接近100%时,你如何找到导致cpu飙升的原因?我的思路是,首先找到进程正在执行的代码行,从而确定可能有问题的代码段.然后,再仔细分析有问题的代码段,从而找出原因. 如果你的程序使用的是c.c++编写,那么你可以很容易的找到正在执行的代码行.但是,程序是php编写的,如何找到可能有问题的代码行呢?这个问题就是本文要解决的问题. 背景知识: 如果你对c语言不熟悉的话,可以略过,直接看 示例演示. 大家都知道php是一个解释性语言.用户编写的ph

Java程序运行原理分析

class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时数据区 线程独占: 每个线程都会有它独立的空间,随线程的生命周而创建和销毁 线程共享: 所有线程都能访问这块内存数据,随虚拟机或GC而创建和销毁 方法区 方法区是各个线程共享的内存区域 用于存储已被虚拟机加载的类信息, 常量,静态变量, 即时编译后的代码等数据 虽然Java虚拟机规范把方法区描述为堆

性能调优:CPU消耗分析

转载请注明出处: http://blog.csdn.net/supera_li/article/details/45221367 cpu消耗分析总体概要图 一张思维导向图,不用说了. top命令,请查阅这篇 http://blog.csdn.net/supera_li/article/details/45220205 pidstat命令,请查阅这篇 http://blog.csdn.net/supera_li/article/details/45221211 参考资料: [1]java分布式应用

Linux 用 ps 與 top 指令找出最耗費 CPU 與記憶體資源的程式最占cpu的进程

Linux 用 ps 與 top 指令找出最耗費 CPU 與記憶體資源的程式 2016/12/220 Comments ######### # top -b -o +%CPU | head -n 22top - 21:02:00 up 2:34, 9 users, load average: 0.10, 0.08, 0.11Tasks: 190 total, 1 running, 189 sleeping, 0 stopped, 0 zombie%Cpu(s): 3.2 us, 2.2 sy,

软件测试第二次作业 - 写一个Java程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示。

题目一: 1. 写一个Java程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示.(单词之间用空格隔开,如“Hello World My First Unit Test”): 2. 编写单元测试进行测试: 3. 用ElcEmma查看代码覆盖率,要求覆盖率达到100%. Demo类: 1 import java.util.HashMap; 2 import java.util.Iterator; 3 import java.util.Map; 4 import java.

编写程序读取一组正数,找出它们的最大数,然后计算该数的出现次数,输入是以 0结束。比如:输入 3 5 2 5 5 5 0,程序找出最大数是 5,它出现的次数是 4。

这里用到了之前没用过的Scanner类和上次提到过的ArrayList类 用户键入一组数.首先找出这组数的最大数max,然后将max与这组数依次比较,相等即count++,计算max出现的次数. 以下附上代码,重点是上面两个类的用法. 1 import java.util.Scanner; 2 import java.util.ArrayList; //导入包 3 public class Test1_10 { 4 private static Scanner input; //私有静态类引用i

找出进程中各线程cpu消耗情况

以root用户执行以下命令,以PID 5423举例: 1,根据top命令,找到占用CPU高的进程,找到PID  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND5423 root      20   0  8892 1284  856 R    0  0.0   0:00.04 top 2,找到该进程后,执行如下命令获取线程列表,并按照CPU占用高的线程排序:[[email protected]]# ps -mp