zoukankan      html  css  js  c++  java
  • java进程占用CPU高的问题

    一. 上节回顾

    怎么查看CPU使用率?

    top:显示了系统总体的CPU和内存使用情况,以及各个进程的资源使用情况。默认每隔3s刷新一次

    ps:只显示每个进程的资源使用情况

    top并没有细分进程的用户态CPU和内核态CPU

    pidstat:可以分析每个进程的CPU使用情况

    通过top,ps,pidstat这些工具,能够很快找到CPU使用率较高的进程。要知道CPU到底是哪个函数导致的问题,需要其它的工具,比如:perf top

    perf top:类似于top,它能够实时显示占用CPU时间最多的函数或命令,因此可以用来查找热点函数

    二. java进程占用CPU高

    1. 准备工作

    前提条件:

    (1) 安装并配置好jdk环境变量(安装位置:/usr/local),安装教程:CentOS7安装JDK1.8图文教程

    (2) 安装tomcat(安装位置:/data),注意和jdk版本的对应关系(tomcat 9-->jdk 8)

    安装完成后,需要在Centos7上关闭防火墙

    #查看防火墙状态
    firewall-cmd --state
    #关闭防火墙
    systemctl stop firewalld.service

    (3) 把pertest.war放到/data/apache-tomcat-9.0.19/webapps下,启动tomcat,看能不能访问http://192.168.0.109:8080/pertest/init1.jsp

    (4) 使用Jmeter制造阶梯型场景,并发20个线程数,持续运行20分钟,需要产生一个比较大的压力,看服务器的资源使用情况

    (5) 根据top命令,发现pid:1480的进程占用CPU高达90%以上。输入top按1

    (6) 通过命令:ps aux | grep 1480,进一步确定是tomcat的进程导致的

    (7) 怎么定位到是哪个线程或者代码导致的?

    这个时候就需要显示线程列表:ps -mp 1480-o THREAD,tid,time

    找到耗时最高的线程,可以看到1482这个线程,占用时间变化较大

    比如:1482这个线程,占用CPU盖度82%,它还在不断的升高

    (8) 把这个线程的id转为16进制格式:printf "%x " 1482

    (9) 打印线程的堆栈信息:jstack 1480 | grep 5ca -A60 

    (10) 在日志里查看:grep 'OutOf' catalina.out,可以看到内存溢出了

    日志里也可以看到一些BLOCKED,WAITING等

  • 相关阅读:
    pat1111-1120
    pat1101-1110
    pat1091-1100
    pat1081-1090
    pat1071-1080
    pat1061-1070
    2017华为软件精英挑战赛总结
    pat1051-1060
    【转】WPF中PasswordBox控件的Password属性的数据绑定
    Python学习-41.Python中的断言
  • 原文地址:https://www.cnblogs.com/my_captain/p/12674247.html
Copyright © 2011-2022 走看看