欢迎来到天天文库
浏览记录
ID:53877564
大小:591.00 KB
页数:14页
时间:2020-04-10
《使用MemoryAnalyzertool(MAT)分析内存泄漏(一).doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、使用MemoryAnalyzertool(MAT)分析内存泄漏(一) 前言 在平时工作过程中,有时会遇到OutOfMemoryError,我们知道遇到Error一般表明程序存在着严重问题,可能是灾难性的。所以找出是什么原因造成OutOfMemoryError非常重要。现在向大家引荐EclipseMemoryAnalyzertool(MAT),来化解我们遇到的难题。如未说明,本文均使用Java5.0onWindowsXPSP3环境。 为什么用MAT 之前的观点,我认为使用实时profiling/monitoring之类的工具,用一种非常
2、实时的方式来分析哪里存在内存泄漏是很正确的。年初使用了某profiler工具测试消息中间件中存在的内存泄漏,发现在吞吐量很高的时候profiler工具自己也无法响应,这让人很头痛。后来了解到这样的工具本身就要消耗性能,且在某些条件下还发现不了泄漏。所以,分析离线数据就非常重要了,MAT正是这样一款工具。 为何会内存溢出 我们知道JVM根据generation(代)来进行GC,根据下图所示,一共被分为younggeneration(年轻代)、tenuredgeneration(老年代)、permanentgeneration(永久代,p
3、ermgen),permgen(或称Non-Heap非堆)是个异类,稍后会讲到。注意,heap空间不包括permgen。绝大多数的对象都在younggeneration被分配,也在younggeneration被收回,当younggeneration的空间被填满,GC会进行minorcollection(次回收),这次回收不涉及到heap中的其他generation,minorcollection根据weakgenerationalhypothesis(弱年代假设)来假设younggeneration中大量的对象都是垃圾需要回收,mi
4、norcollection的过程会非常快。younggeneration中未被回收的对象被转移到tenuredgeneration,然而tenuredgeneration也会被填满,最终触发majorcollection(主回收),这次回收针对整个heap,由于涉及到大量对象,所以比minorcollection慢得多。 JVM有三种垃圾回收器,分别是14throughputcollector,用来做并行younggeneration回收,由参数-XX:+UseParallelGC启动;concurrentlowpausecollec
5、tor,用来做tenuredgeneration并发回收,由参数-XX:+UseConcMarkSweepGC启动;incrementallowpausecollector,可以认为是默认的垃圾回收器。不建议直接使用某种垃圾回收器,最好让JVM自己决断,除非自己有足够的把握。 Heap中各generation空间是如何划分的?通过JVM的-Xmx=n参数可指定最大heap空间,而-Xms=n则是指定最小heap空间。在JVM初始化的时候,如果最小heap空间小于最大heap空间的话,如上图所示JVM会把未用到的空间标注为Virtual
6、。除了这两个参数还有-XX:MinHeapFreeRatio=n和-XX:MaxHeapFreeRatio=n来分别控制最大、最小的剩余空间与活动对象之比例。在32位SolarisSPARC操作系统下,默认值如下,在32位windowsxp下,默认值也差不多。参数默认值MinHeapFreeRatio40MaxHeapFreeRatio70-Xms3670k-Xmx64m由于tenuredgeneration的majorcollection较慢,所以tenuredgeneration空间小于younggeneration的话,会造成频
7、繁的majorcollection,影响效率。ServerJVM默认的younggeneration和tenuredgeneration空间比例为1:2,也就是说younggeneration的eden和survivor空间之和是整个heap(当然不包括permgen)的三分之一,该比例可以通过-XX:NewRatio=n参数来控制,而ClientJVM默认的-XX:NewRatio是8。至于调整younggeneration空间大小的NewSize=n和MaxNewSize=n参数就不讲了,请参考后面的资料。 younggenera
8、tion中幸存的对象被转移到tenuredgeneration,但不幸的是concurrentcollector线程在这里进行majorcollection,而在回收任务结束前空间被耗尽了,这时将会发生FullColle
此文档下载收益归作者所有