AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误

来源:互联网 发布:直播间人气软件 编辑:程序博客网 时间:2024/04/29 19:34

首先介绍下背景情况,这段时间一直在负责一个接入安全节点的项目,系统整体架构采用的是C/S架构,开发语言用的是java,系统整体由4台RA(Router Agent,布署在Linux环境)服务器、2台MA(Master Agent,布署在Aix环境)服务器及2台Integrator产品服务器组成,前段时间发现MA服务隔一段时间后就会抛出OOM(OutOfMemory)错误,为了彻底解决这个问题,决定使用jprofiler这个工具进行系统运行跟踪排查,于是在网上各种搜索相关资料,经过各种尝试最终将jprofiler布署到测试环境上,由于网上相关资料不是很多,而且只针对web应用的,因此记录下来,以备不时之需,具体操作如下:

Jprofiler软件在官网可以提供下载,具体下载地址:http://www.ej-technologies.com/products/jprofiler/overview.html,在此以Jprofiler8.0.7版本为例

一、安装Jprofiler服务端

       一般情况下,Jprofiler服务端布署在远程服务器上,在这里Jprofiler运行环境为Aix环境,因此需要下载Unix版本的安装文件 jprofiler_unix_8_0_7.sh,具体安装操作如下:

      1)对安装文件赋予执行权限,然后直接执行安装文件:sh jprofiler_unix_8_0_7.sh

     

      安装程序需要确认是否安装软件,直接回车(o)

      2)是否默认安装还是定制安装,此处直接回车,选择默认安装,程序默认安装在$HOME/jprofiler8目录下

     

      3)然后是Jprofiler的条款协议等,直接一路回车(Enter),图片略

      4)是否同意以上协议条款,直接选择1(Yes)

     

      5)安装程序开始安装,需要等待一段时间

     

      6)初始化Jprofiler,提示是否运行Jprofiler,此处选择No(n),因为此处Jprofiler是随着java启动脚本启动的,因此暂不启动

      

      7)至此安装完成

      

      8)安装完成,默认安装目录为$HOME/jprofiler8

     

二、安装Jprofiler客户端

      一般情况下,在windows环境通过Jprofiler客户端连接远程服务端进行监控操作,因此还需要安装Jprofiler客户端程序,在如上官网地址下载Jprofiler windows版本jprofiler_windows_8_0_7.exe,windows环境安装步骤相对简单(一路“下一步” ^_^),此处省略,需要说明的是,windows版本可能需要注册码。

三、配置Jprofiler客户端

     Jprofiler客户端软件安装完成后,需要配置客户端连接远程Jprofiler服务端,具体详细配置如下:

     1)点击Start Center,在弹出的窗口选择New Session,选择New Remote Integration按钮

     

      2)在如下窗口选择On a remote computer选项,并且选择Plateform of the remote computer的运行环境为Aix,点击Next

     

      3)在如下窗口选择java虚拟机厂商和版本等信息,在本例中JVM Vendor选择IBM,Version选择1.6.0,Mode选择jit compiler,需要说明的是如果远程服务器的JVM为64位,则需要勾选64-bit JVM复选框,点击Next

     

     4)在如下窗口默认选择Wait for a connection from the JProfiler GUI,点击Next

    

     5)在如下窗口输入远程服务地址,也就是Jprofiler服务端的地址,本例中使用195.203.9.21,点击Next

    

      6)在如下窗口输入远程Jprofiler服务端安装目录,本例中为/home/ap/thdl/jprofiler8,点击Next

     

      7)在如下窗口输入远程Jprofiler服务端的端口,默认为8849,在本例中为8840,点击Next

     

      8)在如下窗口,复制标注中的启动参数并点击Next

     

      9)在如下窗口选择No,I will start the session later,点击Finash,完成配置

     

      10)配置完成,在Open Session中显示连接远程服务的快速链接,此处暂时不启动连接

     

四、配置java启动命令

      将第三部分配置Jprofiler客户中第8步骤中复制的启动参数 -agentpath:/opt/jprofiler/bin/aix-ppc64/libjprofilerti.so=port=8840粘贴到java的启动命令中,以便Jprofiler服务端随java服务启动而启动,具体配置如下所示:

     

      注意:当执行java启动命令时,Jprofiler服务端启动之后为阻塞状态,直到有Jprofiler客户端与之连接后才继续执行java启动命令!

五、启动Jprofiler客户端程序

      1)在如下窗口选择刚刚配置的快速连接,点击Start

     

      2)在如下窗口选择Instrumentation以使用产品所有功能

     

      3)在如下窗口确认相关信息,点击OK

     

      4)此时Jprofiler客户端连接远程服务端成功,开始执行监控任务

      

六、利用Jprofiler客户端远程连接Jprofiler服务端进行实时监控及错误原因剖析

       Jprofiler客户端连接远程服务端启动监控后,可以动态实时地监控系统中应用程序的内存对象分配情况,在本例中,在本地启动模拟测试程序,不断的向被监控的服务器发送消息,然后发现Char[]、String、ByteBuf及ConcurrentHashMap中的对象实例总数一直在增长,占用的内存空间也不断增大,虽然GC一段时间后会进行垃圾回收,但是也只有一小部分的对象被释放,运行一段时间后,Char[]和String对象实例已经达到10万多个,而ByteBuf和ConcurrentHashMap的对象实例达到40万左右,如下图所示:

       

       因此可以初步断定系统中某个程序使用ConcurrentHashMap数据类型时,未及时有效的清除其中无用的元素,致使Map中元素个数在不断的线性增长,经过一段时间后导致内存耗尽,系统抛出OOM异常。经过分析最终在系统中发现,MA服务器在接收到RA服务器转发的报文消息后,正常情况下是将该消息通过唯一ID缓存到Map中,用于重新发送消息到Integrator产品,如果发送成功并接收到Integrator产品返回携带唯一ID的成功回执报文后就会通过唯一ID将该消息清除,但是在Integrator产品组装回执报文的方法中却并未将唯一ID配置到报文消息中,从而导致程序获取不到唯一ID,因此也不会清除Map中的消息实例,也因此导致系统抛出OOM异常,经过修正,各对象实例一直维持在正常范围内,至此OOM异常解决。

     

 



0 0
原创粉丝点击