2024年5月9日发(作者:)

对于L

INUX

类主机JAVA应用程序占用CPU、内存过高的分

析方法介绍

作者:丁启良,新炬网络技术专家

做为一个IT运维人员,通常在运维过程中会遇到各种各样的问题,系统问题、应用问题、

程序问题,而在这当中必然会涉及到性能问题,当用户量过大,或者服务器性能不足以支持

大用户量,但同时又得不到扩容的情况下,进行性能分析,并对系统、应用、程序进行优化

则显得尤为重要,同时也是节省资源的一种必不可少的手段,目前大多数的运维产品都是基

于JAVA语言开发的,下面我给大家介绍一下在linux环境下对JAVA的性能分析手段。

1. 应用程序占用资源高问题

目前大部分应用程序采用的是JAVA语言开发,在产品上线使用一段时间后,经常会出现某

个JAVA程序占用的CPU,内存过高,而且几乎从不释放,导致系统卡顿,用户使用变慢,

如果要恢复,则必须杀掉该进程或重启该服务,然后进行此操作时,必定会导致业务中断。

程序主要由代码组成,优化则需要知道是哪段代码占用资源,并且一个应用占用CPU很高,

除了确实是计算密集型应用之外,通常原因都是出现了死循环,所以通过优化代码来降低应

用程序的资源消耗或者在应用的使用过程中减少死循环则必不可少。

下面我们以4A平台的字符网关服务器为例来进行相应分析。

2. 问题分析

2.1. CPU过高分析

1) 使用TOP命令查看CPU、内存使用状态可以发现CPU占用主要分为两部分,一部分为系

统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比。其中CPU状态中标示id

的为空闲CPU百分比。当空闲CPU百分比越低,说明CPU占用率越高。

2) 初步分析可以发现其中主要占用CPU的进程为java子进程jerrySsh服务(用户访问资

源使用的监听服务),在用户量不大的情况下,CPU消耗资源很大。根据研发反馈字符网关

设定的最大访问量可达到500/台,目前字符网关的资源使用现状无法满足设定的要求。

 分析手段

目前针对Linux下java进程占用CPU高的分析手段主要为使用linux命令查出高CPU使用

的进程,前分析其是由于进程原因还是系统原因,在分析出为进程消耗过高CPU后列出占用

CPU高和占用时间最长的线程并使用jdk自带的jstack工具进行分析CPU使用分析

export JAVA_HOME=/usr/apps/java/jdk1.6.0_20/

1

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/:$JAVA_HOME/lib/

分析过程:

1、根据top命令,发现PID为13033的Java进程占用CPU %id 50%以上,占用CPU过高

2、找到该进程后,首先显示线程列表,并按照CPU占用高的线程排序:

[root@YZ-A-ZFWG-4 ~]# ps -mp 13033 -o THREAD,tid,time | sort –rn

显示结果如下:

找到了耗时最高的线程28358,占用CPU时间达8分多钟

将需要的线程ID转换为16进制格式:

[root@YZ-A-ZFWG-4 ~]# printf "%xn" 28358

6ec6

最后打印线程的堆栈信息:

2