JRockit

使用JRockit作为工具检测并解决JAVA内存泄漏问题

1      JRockit简介

Jrockit是oracle开发的符合JAVA虚拟机规范的虚拟机+虚拟机监控软件。

虚拟机:Jrockit Real Time

监控软件:Jrockit Mission Control

Jrockit Real Time与SUN的JDK是完全兼容的,也就是说以前在SUN的虚拟机上跑的程序,在Jrockit Real Time上不会出现任何问题。

Jrockit是目前尝试过的,唯一一套可以在生产环境中进行内存监控的软件,其他软件都会严重降低虚拟机的效率应用基本无法使用。因为内存泄漏有时就算在压力测试中也很难发现。大部分都是在生产环境中产生的。如果没有一个基本不影响运行效率的软件,想解决只能靠运气。现在有了这个工具,解决起来就非常方便了。

2      下载JRockit3.1.0,并安装

下载地址:http://www.oracle.com/technology/software/products/jrockit/index.html

要同时下载Jrockit Mission Control 3.1.0(监控软件)和Jrockit Real Time 3.1.0(虚拟机)

安装程序获取:jrockit-jdk1.6.0_33-R28.2.4-4.1.0-linux-x64.bin,和jrockit-jdk1.6.0_33-R28.2.4-4.1.0在Linux中家目录和jrockit-jdk1.6.0_33-R28.2.4-4.1.0-windows-ia32.exe(windows)


 

3      服务器端配置

1.    在服务器端安装jrockit-jdk1.6.0_33-R28.2.4-4.1.0-linux-x64.bin;

步骤:

a)        将jrockit-jdk1.6.0_33-R28.2.4-4.1.0-linux-x64.bin以bin的方式上传到服务端指定用户下,本文以noas用户为例;

b)       给jrockit-jdk1.6.0_33-R28.2.4-4.1.0-linux-x64.bin赋予可执行权限:

用户@linux18:~> chmod +x jrockit-jdk1.6.0_33-R28.2.4-4.1.0-linux-x64.bin

c)        运行jrockit-jdk1.6.0_33-R28.2.4-4.1.0-linux-x64.bin

用户@linux18:~> ./ jrockit-jdk1.6.0_33-R28.2.4-4.1.0-linux-x64.bin

安装过程中直接选择“Next”即可。

2.    设置应用程序,使用此Jrockit启动应用程序。

Tomcat 6的设置方法是:

a)        在catalina.sh顶部加入如下内容:

JAVA_OPTS=" -verbosegc-Dcom.sun.management.jmxremote.port=7091-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=本机IP "

原有的JAVA_OPTS加#,该行Xms影响启动,还有个文件中JAVA_OPTS行也是要删除或注释

b)       修改环境变量,确保JAVA_HOME使用的是jrockit-jdk1.6.0_33:

JAVA_HOME=/home/noas/jrockit-jdk1.6.0_33-R28.2.4-4.1.0

JRE_HOME=/home/noas/jrockit-jdk1.6.0_33-R28.2.4-4.1.0/jre

用户@linux18:~>java -version

注:确保7091端口未使用,tomcat配置好了以后需要重启,在启动过程中由于使用了jrockit-jdk后,JVM的一些配置参数可能会无法识别,请根据实际情况修改。

4      监控端设置

1.    首先安装jrockit-jdk1.6.0_33-R28.2.4-4.1.0-windows-ia32.exe,安装过程没有特别要注意的地方,此处不做描述,安装完成后运行之。

变量名:JAVA_HOME   变量值:C:\Program Files\Java\jrockit-jre1.6.0_33-R28.2.4(更改设置:计算机属性:系统属性:环境变量:高级)

变量名:PATH 变量值:D:\new software\UE\;%JAVA_HOME%\bin;

%JAVA_HOME%\bin;

在运行中输入cmd进入系统:java -version(F11全屏)

2.    在JVM浏览器视图中,对连接器文件夹右键,选择新建连接。弹出下图:

 

在“主机”处输入IP,端口与服务端配置一致,默认是7091。输入用户名和口令。点击“测试连接”状态如果是确定则代表已经连接。点击Finish保存新建的连接。在“连接器”文件夹新建了一个连接。

5      开始监控内存

在新建的连接器上点击右键,选择“启动Memleak”,如图:

 

最先看见的是“趋势”选项卡,里边标注了占用JAVA堆大于0.1%的类和数组。

“类型”选项卡,显示了类型与类型之间的引用情况。

“实例”选项卡,显示了实例之间的引用情况。

“分配堆栈跟踪”选项卡,显示了指定类型在虚拟机运行过程中被使用的情况。

启动Memleak, 启动飞信记录(转存)

6      实战(摘录网上一例简单实战举例,后期有详细的内存分析文档再与大家共享)

公司的一个JAVA应用系统上线以来,基本每1天OutOfMemory一次。JAVA堆上限1个G。

1.    10点45分内存使用情况抓屏(趋势选项卡)

注:抓屏前都进行了完全的垃圾回收。

 

2.    13点17分内存使用情况抓屏

3.    结论

占用内存最高的类为:edu.emory.mathcs.java.util.concurrent.ConcurrentHashMap$Segment

此类从10点多的95M涨到13点的129M。没有释放内存。此类引起内存泄露。

edu.emory.mathcs属于backport-util-concurrent开源项目。用于线程并发编程。属于java.util.concurrent包的另一个实现。

4.    堆栈分配跟踪

知道是那个类出了问题,然后就需要知道系统中都那些类使用了这个问题。在edu.emory.mathcs.java.util.concurrent.ConcurrentHashMap$Segment上右键,选择“显示分配跟踪”,进入“分配堆栈跟踪”选项卡,跟踪一段时间如图:

此时就会发现,使用backport-util-concurrent的是AXIS2,使用AXIS2的是我们项目里的文件,并且里边已经标注了堆栈(包名.类名.方法名(文件名:行数) ),这样就知道那里出现问题,对症下药就能够解决了。去修改代码吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值