`
zfy421
  • 浏览: 234142 次
社区版块
存档分类
最新评论

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

 
阅读更多

转自:http://dbaplus.cn/news-21-130-1.html

 

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占用高的线程排序:

  3. [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工具分析是否存在内存泄漏等等。

  • 大小: 87.1 KB
  • 大小: 143.4 KB
  • 大小: 144.5 KB
  • 大小: 5.5 KB
  • 大小: 3.3 KB
  • 大小: 7 KB
  • 大小: 69.4 KB
  • 大小: 13.2 KB
分享到:
评论

相关推荐

    Java获取系统CPU、内存、硬盘等系统信息

    本文将详细探讨如何利用Java获取Windows和Linux系统的CPU、内存以及硬盘信息。 首先,让我们聚焦于CPU信息的获取。在Java中,`java.lang.management`包提供了ManagementFactory类,它包含了获取系统管理信息的方法...

    JAVA性能分析

    然而,随着应用程序规模的增长和复杂度的提高,Java应用程序可能会遇到性能瓶颈问题,如CPU占用过高或内存溢出等问题。这些问题如果不及时解决,不仅会影响应用程序的稳定性和响应时间,还可能导致服务不可用。因此...

    应用及主机巡检java

    客户端则部署在多台主机上,对目标主机的CPU使用率、磁盘空间、内存占用等关键指标进行实时监控。通过Java的网络编程能力,客户端和服务端之间能够建立可靠的通信连接,实时传输数据,确保信息的及时性。 在CPU监控...

    linux服务器应用卡死性能问题排查

    在Linux服务器环境中,应用卡死或性能问题是一个常见的挑战,特别是在处理高负载的服务时。针对这类问题,系统管理员和开发者需要具备一定的技能来快速定位和解决问题。以下是一套详细的排查步骤,结合了`java`、`...

    snmp协议采集windows和linux服务器cpu/内存/磁盘信息。

    在Windows和Linux服务器上,SNMP代理可以暴露关于CPU使用率、内存占用和磁盘空间等关键性能指标。在Windows中,系统服务“SNMP Service”需开启,并配置相应的社区字符串(相当于认证凭据)。在Linux中,通常通过...

    jprofiler_linux_4_3_2.sh

    JProfiler是Ej-Technologies公司开发的一款商业Java性能分析器,它提供了丰富的功能,包括内存分析、CPU使用率分析、线程分析、方法调用统计等,帮助开发者找到并解决Java应用中的性能瓶颈。 二、下载与解压 标题...

    java 局域网监控程序

    3. **进程和应用监控**:监控目标机器上的运行进程和应用程序,了解它们的状态、CPU使用率和内存占用,以检测潜在性能问题。 4. **文件系统监控**:跟踪文件和目录的创建、修改和删除操作,有助于发现未经授权的...

    深入理解嵌入式java虚拟机

    2. **嵌入式系统的特点**:嵌入式系统的资源有限,因此,针对嵌入式环境的Java虚拟机需要在性能、内存占用和功耗等方面进行优化。书本可能会详细讨论这些挑战以及KVM如何解决这些问题。 3. **KVM架构**:KVM利用...

    linux 监控

    Linux监控主要是通过收集系统运行时的各项指标,如CPU使用率、内存占用、磁盘I/O、网络流量等,来评估系统健康状况和性能瓶颈。这对于优化系统配置、预防故障和提升系统效率至关重要。 1. **监控工具**: - **top*...

    ECS 运维指南之Linux系统诊断.pdf

    3. 为什么明明内存很充足但是 java 程序仍申请不到内存。 4. 请不要忽略 min_free_kbytes 的设置。 本文档旨在帮助用户了解 ECS 系统问题诊断的方法,并提供了一些常见问题的排查点和解决方案,以帮助用户更好地...

    linux运维手册.docx

    系统信息检查包括操作系统版本、主机名、主机网络配置、主机日期时间、默认 Java 版本等。 性能检查 性能检查是 Linux 运维的另一个重要方面,通过检查系统的性能,可以了解系统的当前状况,从而进行相应的调整和...

    10、linux命令(14题)1

    对于Java服务端问题,通常需要结合业务日志、数据库状态、JVM监控以及内存分析等多方面进行排查和解决。在遇到问题时,避免直接用vim打开大日志文件,因为它可能会占用大量内存。同时,配置合适的JVM参数和监控机制...

    ECS运维指南之Linux系统诊断.pdf

    3. 分析为什么内存充足但java程序仍申请不到内存,可能是由于系统参数设置不当。 4. min_free_kbytes参数设置不当可能导致频繁触发OOM killer,需要检查并调整该参数。 此外,还包括了某地区口罩项目架构演进及...

    超经典运维指南之Linux系统诊断.pdf

    3. **CPU性能**:即便CPU占用不高,网络性能也可能是影响系统整体性能的关键因素。通过网络抓包和分析工具,可以诊断网络性能问题。 4. **IO异常**:IO瓶颈可能是造成系统性能低下的一个原因,需要通过IO监控和分析...

    JDK-6u14-windows-i586-s.rar

    此外,还有`jconsole`用于监控Java应用的性能,`jmap`用于分析堆内存,`jstack`用于查看线程堆栈信息等。对于KVM优化,可能涉及到更高效的垃圾回收策略、CPU资源分配以及内存管理等方面。 在KVM环境下部署Java应用...

    linux系统模拟实战

    在Linux下,可以使用`javac`编译Java源代码,`java`运行程序,`jar`打包应用。此外,还可以配合版本管理工具如Git,构建工具如Maven或Gradle,以及集成开发环境如IntelliJ IDEA或Eclipse。在Linux的终端中,这些工具...

    zabbix-2.4linux版本

    - **监控项(Items)**:定义要监控的具体数据,如CPU使用率、内存占用等。 - **触发器(Triggers)**:基于监控项的阈值设定报警规则。 - **图形(Graphs)**:用于可视化历史数据,帮助分析系统性能趋势。 - *...

    linux 测试常用命令

    - **应用场景**:评估系统资源,确定测试过程中内存占用情况。 #### 13. 查看磁盘大小 - **命令**: `fdisk -l | grep Disk` - **作用**:列出所有磁盘及其容量信息。 - **应用场景**:确保磁盘空间足够进行大规模...

    藏经阁-ECS 运维指南 之 Linux 系统诊断-96页

    同时,Java程序申请不到内存可能与系统的内存限制有关,需要检查`/etc/security/limits.conf`等配置。 3. **Linux 主机网络问题** - 网络不通可能是由于网络命令如`ifdown`和`ifup`丢失,或者`strace`用于追踪网络...

Global site tag (gtag.js) - Google Analytics