欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-18 16:42:08
...

首先介绍下背景情况,这段时间一直在负责一个接入安全节点的项目,系统整体架构采用的是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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

7)至此安装完成

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

二、安装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按钮

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

四、配置java启动命令

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

五、启动Jprofiler客户端程序

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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

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

AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
            
    
    博客分类: 编程开发软件应用 AIXJprofilerOOMOutOfMemoryException内存溢出 

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