天天看點

Java CPU 占用高 模拟及排查

模拟線上排查CPU占用高的問題

1、模拟代碼如下

package com.jiankunking.cpu;

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * Created by jiankunking on 2018/3/29.
 */
@Component
public class cpuReaper
    @PostConstruct
    public void cpuReaper() {
        int num = 0;
        long start = System.currentTimeMillis() / 1000;
        while (true) {
            num = num + 1;

            if (num == Integer.MAX_VALUE) 
                System.out.println("reset");
                num = 0;
            }
            if ((System.currentTimeMillis() / 1000) - start > 1000) {
                return;
            }
        }
    }
}      

2、打包

mvn clean package  -Dmaven.test.skip=true      

3、部署運作

java -jar cpu-mem-occupy-simulate-0.0.1-SNAPSHOT.jar      

4、檢視系統資源占用情況

Java CPU 占用高 模拟及排查

5、顯示線程清單

#ps -mp pid -o THREAD,tid,time
ps -mp 4463 -o THREAD,tid,time      
Java CPU 占用高 模拟及排查

6、将需要的線程ID轉換為16進制格式:

# printf "%x\n" tid
printf "%x\n" 4464      
Java CPU 占用高 模拟及排查

7、列印線程的堆棧資訊

#jstack pid |grep tid -A 30      

具體堆棧資訊如下:

jiankunking@ubuntu:~$ jstack 4463 |grep 1170 -A 30
"main" #1 prio=5 os_prio=0 tid=0x00007f5ca0009800 nid=0x1170 runnable [0x00007f5ca7cf8000]
   java.lang.Thread.State: RUNNABLE
   //注意這裡 CPU占用高的地方
    at com.jiankunking.cpu.cpuReaper.cpuReaper(cpuReaper.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:369)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:312)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:135)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:423)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1702)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
    at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$73/761960786.getObject(Unknown Source)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    - locked <0x00000000ca217720> (a java.util.concurrent.ConcurrentHashMap)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
    - locked <0x00000000ca1f6e28> (a java.lang.Object)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1234)
    at com.jiankunking.CpuMemOccupySimulateApplication.main(CpuMemOccupySimulateApplication.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)      
小注:執行jstack的使用者要與執行java -jar的使用者一緻

8、原因明确 問題解決。

更加簡便的方法

​​​排查Java的CPU性能問題​​

線上預覽:

​​​https://github.com/jiankunking/cpu-mem-occupy-simulate​​

個人微信公衆号: