内存泄漏分析_调查内存泄漏第2部分–分析问题
内存泄漏分析
这个小型系列的第一个博客介绍了如何创建一个非常泄漏的示例应用程序,以便我们可以研究解决服务器应用程序上基于堆的问题的技术。 它展示了Producer-Consumer模式的一个大问题,即消费者代码必须能够至少与生产者一样快(甚至不是更快)从队列中删除项目。 博客以我开始的示例代码结尾,然后坐了下来,同时它泄漏了足够的内存以进行调查。 现在该进行调查了。
如果您阅读本博客的第1部分 ,您将知道泄漏代码是应用程序1的一部分,该应用程序使用Producer Consumer模式在虚拟数据库中记录了股票/股票定单。 编写示例代码包含一个非常明显的缺陷,即OrderRecord
无法跟上OrderFeed
。 这意味着Order
队列变得越来越大,直到最后,应用程序用完了堆空间并崩溃为止。 问题是,看我的简单代码,问题应该很明显,但是如果您以前从未看过代码,并且它是巨大的,复杂的工业强度代码,又没有简单的监视线程来监视队列大小,该怎么办?或其他内部零件? 那你怎么办呢?
他们是发现泄漏应用程序问题所需的三个步骤:
- 转储泄漏的服务器堆。
- 使用堆转储生成报告。
- 分析报告。
您可以使用多种工具来创建堆转储文件。 这些包括:
- 控制台
- 可视化
- eclipse内存分析器工具(MAT)
使用jconsole进行堆转储
将jconsole
连接到您的应用程序。 单击MBeans选项卡,然后打开com.sun.management
包。 然后,单击HotSpotDiagnostic
。 打开“ Operations
然后选择dumpHeap
。 现在,您将看到dumpHeap
操作,该操作dumpHeap
两个参数p0
和p1
。 在p0
编辑框中键入堆转储的文件名,然后按dumpHeap按钮。
使用jvisualvm进行堆转储
连接到示例代码后,右键单击左侧“应用程序”窗格中的应用程序,然后选择“堆转储”。
请注意,如果您与泄漏的服务器具有远程连接,则jvisualvm将转储文件存储在远程计算机的/tmp
目录中(假设它是Unix机器)。 您将必须将该文件通过FTP传输到您的计算机上以进行进一步分析。
使用MAT进行堆转储
尽管jconsole
和jvisualvm是JDK,MAT或内存分析器工具的一部分,但它是基于eclipse的工具,您可以从eclipse org下载
当前版本的MAT需要在您的PC上安装1.6 jdk。 如果您使用的是Java 1.7,请放心,它将为您安装1.6,并且不会破坏您计算机的其余部分和默认的1.7版本。
使用MAT时,只需单击“获取堆转储”并按照说明进行操作即可。
远程连接
这里要注意的是,如果您想弄清楚生产服务器倒塌的原因,那么您可能必须使用JMX进行远程连接,为此,您需要以下命令行选项,我从我以前的博客重复过:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
何时进行堆转储
这需要一点思考和一点运气。 如果过早获得堆转储,那么您将看不到问题,因为它们被合法的,非泄漏的类实例掩盖了; 但是,不要等待太久,因为进行堆转储需要内存,因此进行堆转储的行为可能会导致应用程序崩溃。
最好的主意是将jconsole
附加到您的应用程序并监视其堆,直到看起来即将崩溃为止。 这很容易发现,因为三个堆部分的指示器都是绿色的:
分析堆转储
这就是MAT自身的用途,因为它旨在分析堆转储。 要打开并分析堆转储,请选择“ File | Open Heap Dump
File | Open Heap Dump
。 选择堆转储文件后,现在将为您提供三个选择,如下所示:
选择: 泄漏可疑报告 。 现在,MAT将流失几秒钟,然后生成如下所示的页面:
饼图表明,在这种情况下,存在一个主要的泄漏嫌疑人。 您可能会认为这是一个修复程序,毕竟这是示例代码,您期望什么? 好吧,是的,在这种情况下,它很明显。 怀疑“ a”占用98.7MB,而内存中的其余对象使用其他1.5MB。 在现实情况中,您确实会得到可疑的泄漏饼图,这是事实。
接下来要做的是更深入地挖掘……
该报告的下一部分(如上所示)告诉我们,有一个LinkedBlockingQueue
正在使用98.46%的内存。 要对此进行进一步调查,请单击Details>>
。
这表明问题确实出在我们的orderQueue
,可通过我以前的博客中的三个对象访问: OrderFeed
, OrderRecord
和OrderMonitor
并且正如我们从代码中知道的那样,其中包含一堆Order
对象。
就是这样了; MAT告诉我们,该示例代码具有一个LinkedBlockingQueue
,它用尽了所有示例应用程序的堆空间,从而导致了巨大的问题。 它并没有告诉我们为什么会这样,您真的不能期望它会发生。 就像阿加莎·克里斯蒂 ( Agatha Christie )的赫尔克里·波洛 ( Hercule Poirot)所说的那样,要使用“ ze little grey cell”……
翻译自: https://www.javacodegeeks.com/2013/12/investigating-memory-leaks-part-2-analysing-the-problem.html
内存泄漏分析
内存泄漏分析_调查内存泄漏第2部分–分析问题相关推荐
- 内存泄漏代码_调查内存泄漏第1部分–编写泄漏代码
内存泄漏代码 前几天,我发现了这个小问题:该服务器运行了一段时间,然后掉下来了. 然后通过启动脚本重新启动,整个过程重复进行. 听起来并没有什么坏处,因为它虽然对数据造成了重大损失,但对业务的重要性并 ...
- java直接内存为什么快_直接内存与 JVM 源码分析
直接内存(堆外内存) 直接内存有一种叫法,堆外内存. 直接内存(堆外内存)指的是 Java 应用程序通过直接方式从操作系统中申请的内存.这个差别与之前的堆.栈.方法区,那些内存都是经过了虚拟化.所以严 ...
- 服务器内存超限问题_服务器内存爆满最佳处置方案
内存爆满截图: 分析:内存持续飙升,应该是有大量内存一直没有释放,考虑僵尸对象,僵尸进程,最简单的就是重启服务器,但是就无法找到罪魁祸首了. 验证:top命令查看活跃进程的资源使用情况.(top命令是 ...
- 服务器内存 知乎_服务器内存和普通内存有什么区别?可以通用吗?
平时大家接触最多的应该是普通内存,也就是我们所说的PC内存,一般来说,内存越大,可用的缓存就越大,电脑的运行速度就越快.用在服务器上是同理,服务器的内存越大,可用缓存就越大,网站的速度也越快. 服务器 ...
- 苹果内存不够怎么办_手机内存清理了还是不够用?不知道这些方法,真是太可惜了...
手机会越用越卡?手机内存不够大,内存不够怎么办?最好的方法就是清理自己的内存,那么你知道自己手机里面的内存怎样清理干净吗?是否还会有一些清理不掉的缓存呢,就算你点了清理,甚至删除了一俩个软件,手机仍然 ...
- 怎么用spss做冗余分析_用SPSS进行医学统计信度分析——【杏花开医学统计】
杏花开生物医药统计 一号在手,统计无忧! 关 注 用SPSS进行医学统计信度分析 关键词:SPSS.信度分析 导 读 上期,我们介绍了量表的基本形式及其研制步骤. 点击观看:<医学研究中量表研制 ...
- r语言进行go富集分析_好用的在线GO富集分析工具
点击上方蓝字关注生信宝典,换个角度学生信. GeneOntology富集分析是高通量数据分析的标配,不管是转录组.甲基化.ChIP-seq还是重测序,都会用到对一个或多个集合的基因进行功能富集分析.分 ...
- 大豆技术面分析_技术贴 | GIS三维视域分析—面要素
GIS 视域分析 理论 01 部分 之前写了一篇技术贴:GIS三维视域分析里面讲了视域分析的相关理论及应用案例,以及具体点.线的视域分析,面要素比较概况,应某位小可爱的要求,今天详细分析面要素的视域分 ...
- 用python对股票进行可视化分析_使用Python对股票进行可视化分析
前言 本文通过对 一.数据爬取 博主采用的数据爬取方式是:利用python的财经数据包tushare,就直接可以将你想获取的数据下载下来,它也是有接口的,利用不同的接口可以获取不同的数据. 代码如下: ...
最新文章
- 苹果风格:分享一组免费的自定义 MacOS 图标
- k8s service:ClusterIP、NodePort、LoadBalancer、ExternalName
- SQL Where in list 问题
- Jira filter subscribe issues
- 一个销售精英拜访客户的6大绝招,胜过10次培训,实用!
- 《Python入门到精通》函数
- dw二级联动下拉菜单插件 宋君墨_Excel下拉菜单不会做?15秒教会你制作一二三级联动下拉菜单,从此做表不求人!...
- 【SQL Server】SQL2005的安装与配置、简单使用
- Python常用模块库下载及安装
- 让子弹飞经典台词|让子弹飞经典语录
- Android 资源和国际化
- JS点击按钮复制文本
- 多种电压转换的电路设计方案
- 20191107 关于mui的app打包
- 使用idea时maven报错:Error reading file pom.xml
- mysql lookup3,引用函数(三):lookup
- 整理好心情,在春天里上路···
- 计算机硬件设备ppt教案,《计算机硬件基础》PPT课件.ppt
- python - TypeError: combat(sume,sumu) missing 2 required positional arguments: sume,sumu
- 测试工程师的明天在哪里
热门文章
- 【期望】选书问题(金牌导航 期望-7)
- MySQL substring()函数
- Java8-本地缓存
- 5分钟带你理解一致性Hash算法
- vue+elementui中,el-select多选下拉列表中,如何同时获取:value和:label的值?
- Photoshop中将图片拖不进软件的编辑区的解决方法,超详细
- stream流把list转为map
- 哈希表的key的类型(传值与传引用)
- 19年8月 字母哥 第六章 生命周期内的拦截过滤与监听 用热点公司网不行
- Linux获取本机hostname函数,Linux下获得主机与域名-gethostbyname和gethostbyaddr