【转】java内存泄漏原因、判定及解决方法

上一篇 / 下一篇  2009-04-13 09:51:23 / 个人分类:performance test

java内存泄漏原因、判定及解决方法
2007年12月06日 星期四 16:06

引子

公司有一个项目,已经交付客户使用最近总出现heap被占满。程序没有相应的情况。公司让我查一查,正好我也早想研究一下java内存泄漏的问题。

目录:

1    关于内存泄露

2    SUN JDK提供JDKPI和最新的JDKTI对内存泄露进行检测。

3    试用内存泄露检测工具

3.1     JProbe

3.2     HPROF

3.3     JRockit Mission Console

正文

1        关于内存泄露

java虚拟机可以自动回收没有被引用的对象。但有时应用程序会有一些对象被引用了但不被使用。这样的对象越来越多的,而虚拟机不能自动回收,就会导致java程序使用的堆越来越多,当超过堆的限制时就会抛出OutOfMemory的错误。

基本上如果抛出OutOfMemory有两种原因:1。内存泄露,2。应用程序本身就是需要这么多的内存。

在启动java的时候加入-verbosegc(Jrockit-verbose:memorygc)参数。每次垃圾回收都会把回收信息打印到标准输出中。如果回收后的内存时候随时间不断增长。那么应用程序肯定是有内存泄露。

确定是内存泄露后,就需要找到是那些对象占用了内存。这需要是使用工具进行检测。

2        SUN JDK提供JDKPI和最新的JDKTI对内存泄露进行检测。

JDKPIsunjdk采用的一种可以检测堆大小情况的c语言的接口。但这个接口1.5中已经被废止。

取而代之的是JDKTI

3        试用内存泄露检测工具

目的:找到一个可以对在Linux上启动虚拟机,进行监控的工具。并且是在生产环境下

3.1    JProbe

JProbeQuest公司提供的工具。具有GUI界面(java写的界面)。可以显示每个类型占堆的大小。

工具有几个缺点:

1。只有通过JProbe启动的虚拟机,JProbe才能对其的堆进行检测。这就要求,虚拟机要和JProbe安装在一台机器上。但很多内存泄露是在生产环境中发现的。生产环境中的很多都是Linux机器,程序员通过ssh控制。要使用图形工具配置比较费劲。修正:应该可以象JRockit那样在服务器开通一个端口,在本地监控。但我没有仔细研究,应该和JProfiler差不多。见:http://hi.baidu.com/shiliangshuai/blog/item/65d76263f0850c640d33fae0.html

2。并没有使用服务器的启动脚本。如果你在脚本里修改了classpath,加载了新的类,就无法对这个类进行测试了。也就是说,即时在测试环境中,无法做到与生产环境完全一致,那么测试结果也就没什么意义了。

3.2     HPROF

HPROFsun内置的工具。启动虚拟机的时候,加入参数可以控制是否使用HprofHprof可以列出堆中占用内存最多的对象。

启动方式:在启动虚拟机的时候加入参数-Xrunhprof:head=site

查看方式:threaddmup的时候会生成java.hprof.txt文件。里边记录了head的详细信息。

这个工具的缺点是:

加入hprof的参数后,java虚拟机的运行非常慢。

据说要比正常慢20倍。无法应用在生产环境中。

3.3     JRockitMission Console

这个工具只能监控bea的虚拟机JRockit的运行情况,使用的接口也不是sunjdkjvmpijvmti了。

JRockitMissionConsole1.4.2中是集成在JRockit中的(jrockit-R27.4.0-jdk1.4.2_15\bin\jrmc.exe)。

基本的使用方法:在启动JRockit虚拟机时开放监控端口,JRockitMission Console可以在任何机器上运行,对开放了端口的虚拟机进行监控。并且基本没有额外的系统开销,与sunjdk完全兼容。这样就可以在生产环境中启动jdk,然后在程序员的机器中对Linux上的jdk运行情况进行监控。这正式我想要的。

因为我们的服务器使用的是1.4.2。所以,首先下载JRockit1.4.2的最新版本。并且要最新的,因为JRockit版本号低于1.4.2.10的似乎不能使用JRockitMission Console中的Memory Leak Detector

JRockit1.4.2无论是在window还是Linux安装都非常方便,按bea的文档做就可以。

然后重新配置一个weblogicdomain。配置的时候指定使用JRockit作为虚拟机。

修改startWeblogi.sh脚本加入-Xmanagement:port=7090参数,最好也把-Xverbose:memory加上,可以看到垃圾回收的情况。启动weblogic

在本机启动JRockitMission Console,建立对服务器的连接,启动Memory Leak Detector就可以对java堆进行监视了。

Memory Leak Detector4个视图:

1。趋势:这视图里列出了所有类型,占堆的百分比,对象数,最重要的是“增长(字节/秒)”,这个列高了。就有可能是内存泄露。

注意:这个视图在jdk进行垃圾回收后才传回信息,也就是说,如果没有进行垃圾回收就不会刷新。建议通过点垃圾回收按钮刷新界面。

否则,虽然可以自动刷新,但增长这个列一直0,不进行自动计算。也许是一个bug吧。

2。类型:这个视图,通过在趋势中对感兴趣的类,右键->显示引用类型来进入。主要显示了选中类,与引用选中类的类。用箭头显示中间的关系。非常漂亮。

3。实例:这个视图显示的是类的实例。是在类型中对感兴趣的类型右键->显示实例,或最大数组中右键->显示实例切换到这个视图的。显示一些实例之间的引用关系。

4。分配堆栈跟踪:这里可以看到指定类是在那个类中的第几行被实例化的。

注意:只有切换到这个视图,才对指定的类进行跟踪。如果切换过来后,这个类没有被实例化过,那么也看不到任何调用信息。

这是最有用的一个视图。类型和实例虽然很全,但由于类之间的关系复杂,有时,并不能找的找到需要的信息。

这个工具的缺点是:使用Memory Leak Detector,需要到bea下载license。这个license分为2中。

一种是开发用的,这种在jdk启动1小时后,Memory Leak Detector就失效了。必须重新启动虚拟机才行。

另一种是企业级的,需要收费,没有时间限制。

限于时间的关系就写这么粗糙吧。

参考资料:

非常多。说实话,我也记不住了。

后记:

由于没有找到破解的license,所以只好通过增加java堆栈的大小来延缓程序的死掉。其实,如果设置为512程序基本上可以挺一个月。我给设置了1G。2个月应该能挺住。

同事我在启动的时候加入了-verbosegc参数。希望能打印出一些有用的gc信息。

在设置堆栈的过程中发现一个问题。刚刚启动的时候,sun 的jdk 大概使用了30M的内存。而JRockit则使用了300M。JRockit本身也有点问题。观察观察再说吧。

以后有时间再试用一下sun jdk 1.5和1.6在这方面应该有很大的改进。毕竟新推出了JVMTI来取代JVMPI,没有改进就没有必要推出了。


TAG:

引用 删除 HB07140030   /   2009-05-12 22:18:01
用UFO可以彻底解决这类问题,www.gm365.com上发布的UFO信息:
∵ 最新公告   
  (2009年5月11日)
  [UFO下载]:UFO 1.10版发布(点此下载)。1.10版纠正1.00版中对新建的Context需要手工创建WORK目录的问题和https状态下的几个Bug。 1.00版提供全新的examples demo,对中文乱码问题的解决给出足够的示例,可以配置多个数据库连接池,动态检查装载servlet,提供详细的Howto文档(阅读此Howto文档)。UFO自0.975版以来已很稳定地运行(作为gm365网站的web server),不会出现一个字节的内存泄漏和一个线程的不能回收。 UFO:一个支持Jsp、Servlet、静态网页、虚拟主机、数据库连接池、http、https、无线互联网mimeType标准、认证和Tag库的Web Server。

使用UFO做Web Server的好处是网站能做得很稳定,永远也不会自己down掉;UFO在托管机房丢包率很高、遭受Hacker攻击、互联网 骨干网被黑等恶劣的环境条件下仍然能很好地运行;UFO在对付Hacker方面(防Hacker弄down和Hacker抓取不该访问的资源)也有足 够措施。
另外,UFO几乎不会进行垃圾回收,消耗CPU很少,在普通的PC Server上用UFO运行网站,平时CPU占用率<0.1%,最多时也不会超 过5%。您知道,JVM的垃圾回收会导致大量的运算,消耗很多CPU,从而导致Server的负载能力和响应速度下降。UFO在对象管理方面采 用了很好的机制和算法,做得很出色。用UFO运行网站,可以一直保证高负载能力,快速的响应速度和低CPU消耗。

另外,UFO有超一流的响应速度,用UFO运行网站网页刷地一下就出来了,在相等的Server硬件条件和出口带宽的情况下,UFO与 用C写的Web Server中的佼佼者相比,UFO很出色(尤其是任务忙时用户的“感觉快”的体验好于或不差于任何其它Web Server)。
 

评分:0

我来说两句

Open Toolbar