探究内存泄露—part2—分析问题-java开发java经验技巧

探究内存泄露—part2—分析问题-java开发java经验技巧

ID:32984063

大小:56.68 KB

页数:6页

时间:2019-02-18

探究内存泄露—part2—分析问题-java开发java经验技巧_第1页
探究内存泄露—part2—分析问题-java开发java经验技巧_第2页
探究内存泄露—part2—分析问题-java开发java经验技巧_第3页
探究内存泄露—part2—分析问题-java开发java经验技巧_第4页
探究内存泄露—part2—分析问题-java开发java经验技巧_第5页
资源描述:

《探究内存泄露—part2—分析问题-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、探究内存泄W—Part2—分析问题-Java开发Java经验技巧探究内存泄露一Part2—分析问题木文由ImportNew・黄索远翻译自captaindebug0欢迎加入翻译小组。转载请见文末要求。在这个系列的第一篇博客里,我写了一个内存泄露的例子。下面我们将在例子里构建好的服务器上,探寻如何解决堆内存泄露问题。这个例了展现了消费者一生产者模式存在的一重要问题,即消费者移除队列的速度不能慢丁•生产的速度(生产者产生的单位存放在这个队列里)。在上一篇博•客的末尾,我将例子代码运行起来了,坐等有足够的内存溢出来便于探究,现在是吋候完成调查了。如果你看过这

2、篇博客的第一部分,就会知道在展示的内存泄露示例代码使用生产者-消费者模型创建了一个模拟股票交易的应用,所有的交易命令都被存入一个虚拟的数据库中。示例代码故意留下了一个缺陷(OrderRecord线程处理一条命令后sleep一段时间),使得OrderRecord线程消费命令的速度跟不上OrderFeed线程生产命令的速度。这就意味着存储命令的队列会变得越来越长,直到最后内存溢出程序崩溃。问题是,如果只看我的代码,确实能够很轻松得看出哪里出了差错;但是如果岀问题的代码你从未看过并且代码又长又复杂,加Z没有监控线程来帮助你观察队列大小或者其他内部信息,这时

3、该怎么办呢?下面向大家介绍分析程序内存泄露问题的三个步骤:1.提取发牛内存泄露的服务器的转储文件。2.用这个转储文件生成报告。3.分析生成的报告。有儿个工具能帮你生成堆转储文件,分别是:•jconsole•Jvisualvm•Eclipse?Memory?Analyser?Tool(MAT)用jconsole提取堆转储文件将jconsole关联你的应用:单击MBeans选项卡打开com.sun.management包,点击HotSpotDiagnostic,点击Operations选择dumpHeap0这时你将会看到dumpHeap操作:它接受两个参

4、数pO和pl。在pO的编辑框内输入一个堆转储的文件名,然后按下DumpHeap命令。用jvisualvm提取堆转储文件连接示例代码,右键点击你的应用,在左侧的“application”窗格中选择"Heap?Dump”。注意:如果你在发生内存泄露的服务器上冇一个远程连接,那么jvisualvm将会把转出文件保存在远程机器(假设这是一台tmix机器)上的/tmp目录下。你不得不将这个文件通过FTP传送到你的机器上,然后再进行研究。用MAT来提取堆转储文件jconsolc和jvisualvm本身就是JDK的一部分,而MAT或者称作“内存分析工具”,是一个基

5、于eclipse的工具。你可以从eclipse,orgT*载。最新版木的MAT需要你在电脑上安装JDkl.60如果你用的是Javal.7版木也不用担心,因为它会自动为你安装1・6版本,并且不会和安装好了的1.7版本产生冲突。使用MAT的时候,只需要点击“Aquire?Heap?Dump”,然后遵循指示就可以了。远程连接值得注意的是,如果想要搞清楚为什么一个作为生产者的服务器会崩溃,那么你可能要使用JMX远程连接。为此你需要下面的命令行选项,我从上一篇的博客中将其抄了下來:-Dcom.sun.management.jmxremote-Doom.sun.

6、management.jmxremote.port=9010-Dcom.sun.managcment.jmxremote.local,only二false-Dcom.sun.management,jmxremote.authenticate二false-Dcom.sun.management,jmxremote.ssl=false何时提取堆转存文件这需要耗费一点心力和运气。如果太早提取了堆转储文件,那么你将不能发现问题。因为它们被合法,非泄露类的实例屏蔽了。不过也不能等待太久,因为提取堆转储文件需要占用内存,进行提取操作的时候可能会导致你的应用崩溃。

7、最好的办法是将jconsole连接到你的应用程序并监控堆的占用情况,知道它看起來像在崩溃的边缘。这样很容易就能监控到,因为没冇发生内存泄霜时,三个堆部分指标都是绿色的。分析转储文件现在轮到MAT发挥作用了,因为它本身就是被设计用来分析堆转储文件的。要打开和分析一个堆转储文件,选择File选项下的Heap?Dump选项。选择了你要打开的文件后,你将会看到如下三个选项:选择Leak?Suspect?Report选项。在MAT翻腾儿秒后,会生成这样的一个页面:如饼状图显示:在示例中,疑似有一处发生了内存泄露。也许你会想,这样的做法只有在代码受到控制的情况下

8、才可取。毕竟这只是个例子,这又能说明什么呢?好吧,我承认在这个例子里,所有的问题都是可见的;线程a占用了98

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。