LINUX类主机JAVA应用程序占用CPU、内存过高分析手段

转载声明:本文为DBA+社群原创文章,转载必须连同本订阅号二维码全文转载,并注明作者名字及来源:DBA+社群(dbaplus)。

 

做为一个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/

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

分析过程:

  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 "%x\n" 28358

6ec6

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

经比对发现占用CPU高的jerrySsh服务中高消耗CPU的代码均为一些等待和读取的语句。内核时间占用最长的线程所使用的代码抓取:

2.2. 内存使用分析

目前字符网关内存使用趋于平衡,除偶尔出现close_wait连接后由于未能得到及时释放而占用了大量内存导致buffers/cache较小外,其他线条暂未出现问题,据研发反馈已经做过优化,但是从目前观察来看coles_wait连接释放时间稍长。并且由于buffers、cached释放不出来,导致系统剩余物理内存较小,可能会影响系统性能,为了彻底解决此类问题,所以我们做了以下分析:

在linux的内存分配机制中,系统优先使用物理内存,当物理内存还有空闲,表示还够用时,不会释放其占用内存,即使占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快,因此查看目前进程正在实际被使用的内存(used-buffers-cache),也可以认为如果交换分区(swap)没有大量使用,物理内存(mem)还是够用的,只有物理内存(mem)被当前进程实际占用完(没有了buffers和cache),才会使用到交换分区(swap)。

但是从代码的角度,目前研发人员主要关注java.lang.OutOfMemoryError: Java heap space异常,减少不必要的对象创建,同时避免内存泄漏,所以分析代码才是我们接下来要做的主要工作;以下为字符网关分析内存占用的故障排查过程:

● 分析手段

  1. top命令:Linux命令。可以查看实时的内存使用情况。  
  2. jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。
  3. jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏。

Java提供了一个很好的内存监控工具:jmap命令

jmap命令有下面几种常用的用法:

从上述打印的日志可以得知该进程调系统进程占用内存的主要程序。

使用./jmap -histo:live 14978查询当前 Java进程创建的活跃对象数目和占用内存大小。

 

可以日志中发现constMethodKlass、methodKlass、symbolKlass都占用了大量的内存,特别是占用了大量内存的int数组,需要仔细检查相关代码,接下来这些事就可以丢给研发了。

3. 总结分析手段

● 分析CPU占用的方法和手段:

  1. top命令:可以查看实时的CPU使用情况。
  2. ps -ef命令:可以查看进程以及进程中线程的当前CPU使用情况以及属于当前状态的采样数据。
  3. jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
  4. pstack:Linux命令。可以查看某个进程的当前线程栈运行情况

● 分析内存性能的方法和技巧:

  1. top命令:可以查看实时的内存使用情况。  
  2. jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。
  3. jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏等等。


时间: 2024-10-31 18:31:28

LINUX类主机JAVA应用程序占用CPU、内存过高分析手段的相关文章

win7系统使用pptv看电影占用CPU内存高达100%怎么办

  win7系统使用pptv看电影占用CPU内存高达100%怎么办?说起pptv相信大家都不会陌生了,pptv是一款全球安装量最大的网络电视,拥有高清视频,一些win7系统用户使用pptv看电影时,发现pptv占用大量的CPU内存,已经高达100%,如果这时候打开其他程序很容易出现卡机现象,而且系统运行速度也会变慢很多,怎么办呢?这时候我们需要对pptv进行一些简单的设置,下面一起看看具体的解决方法. 1.如果我们不是从官方网站下载的pptv的话可以到官方下载最新版本的pptv了; 2.如果是官

win7系统Svchost.exe占用cpu资源过高怎么办

win7系统Svchost.exe占用cpu资源过高的解决方法 先来看一下任务管理器下Svchost.exe占用了47%的CPU资源,在高的时候达到80%以上 我们首先右键点击任务栏空白处,然后在弹出菜单中选择"启动任务管理器"菜单项 在打开的任务管理器中点击"查看/选择列"菜单项 这时会打开选择进程页列窗口,选中最上面的"PID(进程标识符)"前的复选框 这时在任务管理器中就可以看到多了一个PID列,我们看到占用CPU资源高的Svchost.e

如何监控Java应用程序的Windows内存使用情况

Java 技术最知名的一个优点是:与其他语言如 C 程序员不同,Java 程序员不需要对令 人畏惧的内存分配和释放负责.Java 运行库可以为您管理这些任务.每个实例化的对象都自 动在堆中分配内存,垃圾收集程序定期收回不再使用的对象所占据的内存.但是您还不能完 全撒手不管.您仍然需要监控程序的内存使用情况,因为 Java 进程的内存不仅仅包括堆中 分配的对象.它还包括程序的字节码(JVM 在运行时解释执行的指令).JIT 代码(已经为 目标处理器编译过的代码).任何本机代码和 JVM 使用的一些

在LIUNX服务器上找出web项目中占用cpu资源最多的线程的排查方法

在这里对linux下.sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结:linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: 第一步:登陆到web服务所在的liunx服务器,利用top命令获取java的cpu使用率 第二步: 如上图所示,java的进程id为'3260',接下来用top命令单独对这个进程中的所有线程作监视:top -p 3260 -H 第三步: 如上图所示,linux下,所有的

虚拟主机的流量限制、CPU限制、IIS限制的含义以及对比

站长在寻找虚拟主机时,往往容易被"不限IIS连接数,不限流量"等诱惑,但一台服务器要放上百个网站怎么可能不限制?换一种想法,假设他不限制每个站点的资源,虚拟主机的资源(cpu.内存.带宽等)总是有限的,那么只要这几百个网站中有一个网站占用资源多,其他网站都会受到牵连.没有限制就没有自由,没有限制是不可能的. 当前虚拟主机主要分为三类限制: 一.流量限制: 就是直接限制网络流量,这种限制通常是最严厉的一种限制,10个G的流量大体支持50人在线以内.当月流量超过后,在一个月内网站都不能正常

在NetBeans IDE 6.0中分析Java应用程序性能

NetBeans IDE 6.0 包含一个强大的性能分析工具,可提供与应用程序运行时行为有关的重要信息.通过 NetBeans 性能分析工具,我们可以方便地在 IDE 中监控应用程序的线程状态.CPU 性能以及内存使用情况,而且产生的开销相对较少. 本文将概述 IDE 中包含的性能分析工具,并指导您快速开始分析 NetBeans 项目的性能.本文旨在演示 IDE 中可用的各种性能分析任务以及分析项目性能时可以获得的分析结果.但并不覆盖 IDE 中包含的所有性能分析功能,也不会深入探索如何研究性能

在NetBeans IDE 6.0中开发通用Java应用程序简介

本简明教程将演示如何在 NetBeans IDE 6.0 中开发 Java SE 应用程序.本教程假定您对 Java 应用程序的开发已比较熟悉.在讲解过程中,我们将演示如何通过一些 IDE 特性简化应用程序开发. 我们将开发一个单词转换应用程序,用于将多个英文单词转换为一个英文单词.生成单词的构成形式为第一个词的第一个字母.第二个词的第二个字母.第三个词的第三个字母,依此类推.该生成词称为 离合词. 建立项目 我们创建的应用程序将包含两个项目: 具有实用程序类的 java 库项目. 具有 mai

C# Winform应用程序占用内存较大解决方法整理(转)

原文:http://www.jb51.net/article/56682.htm 背景: 微软的 .NET FRAMEWORK 现在可谓如火如荼了.但是,.NET 一直所为人诟病的就是"胃口太大",狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的. 以XP 系统为例子,程序启动后,打开任

WPF:警惕TextBox会占用过多内存

原文:WPF:警惕TextBox会占用过多内存 问题源自这篇文章:WPF的TextBox产生内存泄露的情况. 整个问题是这样的,文章作者演示使用类似下方的代码来不停地像WPF的TextBox控件赋值: for (int i = 0; i < 10000; i++) {     //tbx是界面上的TextBox变量     tbx.Text += string.Format("{0}\n", i); } 然后会出现程序占用过多内存的问题.   很快在那篇文章的评论中有人指出这个和