JProfiler使用详细教程学习笔记

本文介绍使用JProfiler检测和分析Tomcat服务器中的内存泄漏问题,通过具体步骤展示如何定位和解决由ThreadLocal引起的内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:JProfiler使用详细教程学习笔记

					<div class="htmledit_views" id="content_views">

在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析记录下来,已备今后遇到相似问题时可以作为参考。


运行环境:

Tomcat6,jdk6,JProfiler8


内存泄漏的现象:

1. 在服务器中执行某些批量操作的时候,发现内存只升不降;就算gc后,内存也不能被完全释放;
2. 除非重启tomcat服务器,内存永远不会被释放,反复执行这些操作,会导致无可用内存,tomcat死掉;


使用JProfiler检查内存泄漏的步骤:

1. 初始化检验环境:

切换到“Live Memory-->All Objects”标签,可以看到当前tomcat中的对象情况。


在执行操作前,需要先运行“Run GC”,使jvm进行内存回收,清理无效的对象;


为了便于比较内存的增长情况,可以点击"Mark Current"按钮,来将当前内存使用情况作为参照;


点击后会显示“Difference”列,该列会列出对象数量的变化和变化比率;


2.打开内存记录:

点击“Start Recordings”按钮,开始记录。执行这步的主要目的是为下面“Heap Walker”,设置一个监控区间;如果不记录的话,“Heap Walker”将分析jvm虚拟机的所有内存,即耗时又不能准确的发现内存泄漏的原因。


3. 执行操作,执行gc;

执行会引起内存泄漏的操作,执行完进行内存回收;


可以点击下面的“update”按钮,进行视图的更新;


执行内存回收后,仍然存在于内存中的对象有可能是泄漏的对象;如下图,instance count中红色的部门为不能回收的对象,difference列列出了增加的对象数量和增幅;以String为例,在该操作中增加了31751个对象,增幅达到了14%,随后会在HeapWalker中观察这些对象,分析哪些对象是泄漏的;

一般引起泄漏的对象包括:String,char[],HashMap等,这些对象需要重点关注下;



4. 关闭内存记录:

点击“Stop Recordings”关闭内存记录,告诉jProfiler把这段记录作为分析对象;


5. 找到增加迅速的对象类型,打开HeapWalker:

在视图中找到增长快速的对象类型,一般包括String、char[]、Map等;


在这个操作中,String的增长速度很快。在Liver memory视图中找到String,点右键,选择“Show Selectiion In Heap Walker”,切换到HeapWarker 视图;



切换前会弹出选项页面,注意一定要选择“Select recorded  objects”;这样Heap Walker会在刚刚的那段记录中进行分析;否则,如果不勾选的话,他会分析tomcat的所有内存对象,这样既耗时又不准确;



6. 在HeapWalker中,找到泄漏的对象;

HeapWarker 会分析内存中的所有对象,包括对象的引用、创建、大小和数量;


通过切换到References页签,可以看到具体的对象;


在这些内存对象中,找到泄漏的对象(应该被回收);可以在该对象上点击右键,选择“Use Selected Instances”缩小对象范围;


7. 通过引用分析该对象:

在References引用页签中,可以看到该对象的的引用关系,可以切换incoming/outcoming,显示引用的类型:

incoming  表示显示这个对象被谁引用;

outcoming 表示显示这个对象引用的其他对象;



选择“Show In Graph”将引用关系使用图形方式展现;



选中该对象,点击“Show Paths To GC Root”,会找到引用的根节点;




在上图中,我们可以发现,这个String对象最终的引用是在Thread线程中的ThreadLocalMap对象中;这给我们提供了线索,我们需要在程序中查找有关ThreadLocalMap部分的代码,检查为什么这个对象没有被释放;这往往就是泄漏的根源。


8. 通过创建分析该对象:

如果第7步还不能定位内存泄露的地方,我们可以尝试使用Allocations页签,该页签显示对象是如何创建出来的;
我们可以从创建方法开始检查,检查所有用到该对象的地方,直到找到泄漏位置;


内存泄漏的原因分析:

通过上面的分析,这次内存泄露主要由下面的原因造成:
有操作将对象存放在ThreadLocal的静态变量中,引用不会被释放,所以该对象不会被回收,一直存在于内存中,导致内存泄漏;

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
                                            <div class="more-toolbox">
            <div class="left-toolbox">
                <ul class="toolbox-list">
                    
                    <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#csdnc-thumbsup"></use>
                    </svg><span class="name">点赞</span>
                    <span class="count">6</span>
                    </a></li>
                    <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#icon-csdnc-Collection-G"></use>
                    </svg><span class="name">收藏</span></a></li>
                    <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#icon-csdnc-fenxiang"></use>
                    </svg>分享</a></li>
                    <!--打赏开始-->
                                            <!--打赏结束-->
                                            <li class="tool-item tool-more">
                        <a>
                        <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                        </a>
                        <ul class="more-box">
                            <li class="item"><a class="article-report">文章举报</a></li>
                        </ul>
                    </li>
                                        </ul>
            </div>
                        </div>
        <div class="person-messagebox">
            <div class="left-message"><a href="https://blog.csdn.net/a294039255">
                <img src="https://profile.csdnimg.cn/8/7/3/3_a294039255" class="avatar_pic" username="a294039255">
                                        <img src="https://g.csdnimg.cn/static/user-reg-year/1x/10.png" class="user-years">
                                </a></div>
            <div class="middle-message">
                                    <div class="title"><span class="tit"><a href="https://blog.csdn.net/a294039255" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">小乞丐0</a></span>
                                        </div>
                <div class="text"><span>发布了33 篇原创文章</span> · <span>获赞 47</span> · <span>访问量 8万+</span></div>
            </div>
                            <div class="right-message">
                                        <a href="https://im.csdn.net/im/main.html?userName=a294039255" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                    </a>
                                                        <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                </div>
                        </div>
                </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值