调查内存泄漏第2部分–分析问题

这个小型系列的第一个博客介绍了如何创建一个非常泄漏的示例应用程序,以便我们可以研究解决服务器应用程序上基于堆的问题的技术。 它展示了Producer-Consumer模式的一个大问题,即消费者代码必须能够至少与生产者一样快(如果不是更快)从队列中删除项目。 博客的结尾是我开始示例代码,然后坐下来,同时它泄漏了足够的内存以进行调查。 现在该进行调查了。

如果您阅读本博客的第1部分 ,您将知道泄漏代码是应用程序1的一部分,该应用程序使用Producer Consumer模式在虚拟数据库中记录了股票/股票定单。 编写的示例代码包含一个非常明显的缺陷,即OrderRecord无法跟上OrderFeed 。 这意味着Order队列会越来越大,直到最后,应用程序用完堆空间并崩溃为止。 问题是,看我的简单代码,问题应该很明显,但是如果您以前从未看过代码,并且它是巨大的,复杂的工业强度代码,又没有简单的监视线程来监视队列大小,该怎么办?或其他内部零件? 那你怎么办呢?

他们是发现泄漏应用程序问题所需的三个步骤:

  1. 转储泄漏的服务器堆。
  2. 使用堆转储生成报告。
  3. 分析报告。

您可以使用多种工具来创建堆转储文件。 这些包括:

  1. 控制台
  2. 可视化
  3. eclipse内存分析器工具(MAT)

使用jconsole进行堆转储

jconsole连接到您的应用程序。 单击MBeans选项卡,然后打开com.sun.management包。 然后,单击HotSpotDiagnostic 。 打开“ Operations然后选择dumpHeap 。 现在,您将看到dumpHeap操作,该操作dumpHeap两个参数p0p1 。 在p0编辑框中键入堆转储的文件名,然后按dumpHeap按钮。

投资1

使用jvisualvm进行堆转储

连接到示例代码后,在左侧“应用程序”窗格中右键单击您的应用程序,然后选择“堆转储”。

请注意,如果您与泄漏的服务器建立了远程连接,则jvisualvm将转储文件存储在远程计算机的/tmp目录中(假设它是Unix机器)。 您将必须将该文件通过FTP传输到计算机上,以进行进一步分析。

投资2

使用MAT进行堆转储

尽管jconsole和jvisualvm是JDK,MAT或内存分析器工具的一部分,但它是基于eclipse的工具,您可以从eclipse org下载

当前版本的MAT需要在您的PC上安装1.6 jdk。 如果您使用的是Java 1.7,请放心,它将为您安装1.6,并且不会破坏您计算机的其余部分和默认的1.7版本。

投资3

使用MAT时,只需单击“获取堆转储”并按照说明进行操作即可。

投资4

远程连接

这里要注意的是,如果您想弄清楚生产服务器为何倒塌,那么您可能必须使用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

何时进行堆转储

这需要一些思想和运气。 如果过早获得堆转储,那么您将看不到问题,因为它们被合法的,非泄漏的类实例掩盖了; 但是,不要等待太久,因为进行堆转储需要内存,因此进行堆转储的行为可能会导致您的应用程序崩溃。

投资5

最好的主意是将jconsole附加到您的应用程序并监视其堆,直到看起来即将崩溃为止。 这很容易发现,因为三个堆区指示器都是绿色的:

投资6

分析堆转储

这就是MAT自身的用途,因为它旨在分析​​堆转储。 要打开并分析堆转储,请选择“ File | Open Heap Dump File | Open Heap Dump 。 选择堆转储文件后,现在将为您提供三个选择,如下所示:

投资7

选择: 泄漏可疑报告 。 现在,MAT将流失几秒钟,然后生成如下所示的页面:

投资8

饼图表明,在这种情况下,存在一个主要的泄漏嫌疑人。 您可能会认为这是一个修复程序,毕竟这是示例代码,您期望什么? 好吧,是的,在这种情况下,它很明显。 怀疑“ a”占用98.7MB,而内存中的其余对象使用其他1.5MB。 在现实情况下,您确实会得到可疑的泄漏饼图。

接下来要做的是更深入地挖掘……

投资9

该报告的下一部分(如上所示)告诉我们,有一个LinkedBlockingQueue正在使用98.46%的内存。 要对此进行进一步调查,请单击Details>>

投资10

这表明问题确实出在我们的orderQueue ,可通过我以前的博客中的三个对象访问: OrderFeedOrderRecordOrderMonitor并且正如我们从代码中知道的那样,它包含一堆Order对象。

就是这样了; MAT告诉我们,该示例代码具有一个LinkedBlockingQueue ,它用尽了所有示例应用程序的堆空间,从而导致了巨大的问题。 它并没有告诉我们为什么会这样,您真的不能期望它会发生。 就像阿加莎·克里斯蒂 ( Agatha Christie )的赫尔克里·波洛Hercule Poirot)所说的那样,使用“ ze little grey cell”……

参考: 调查内存泄漏第2部分– Captain Debug博客博客中来自JCG合作伙伴 Roger Hughes 的问题分析 。

翻译自: https://www.javacodegeeks.com/2013/12/investigating-memory-leaks-part-2-analysing-the-problem.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es6 语法 (Decorator)

修饰器是一个函数,用来修改类的行为(注意:1、函数 2、修改行为 3、对类进行操作){//修饰器函数定义 target:类本身,name名称,descriptor描述let readonly function(target, name, descriptor) {descript…

11小时 python自动化测试从入门到_从设计到开发Python接口自动化测试框架实战,资源教程下载...

课程名称从设计到开发Python接口自动化测试框架实战,资源教程下载课程简介:课程从接口基础知识入门,从抓包开始,到接口工具的运用,再到常见接口库、接口开发、Mock服务、unittest框架的运用,再讲解接口测试…

在Objc项目中调用Swift

之前的文字中记录了在Swift项目中调用OC的相关代码,比较简单直接 传送门 但是在OC中调用swift代码则不是那么的和谐,网络上很多文章业已经有点陈旧。记录步骤如下: 1.创建OC项目 (1)启动 xcode -> 创建singleView新项目 -> 命名为: obj…

「SDOI2014」数数 解题报告

「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串。 例如当 \(S(\)22, 333, 0233\()\) 时,233 是幸运数,2333、20233、3223 不是幸运数。 给定 \(N\) 和…

pymssql mysql_Python利用pymssql访问mysql数据库

#codingutf8#!/usr/bin/env python#-------------------------------------------------------------------------------# Name: pymssqlTest.py# Purpose: 测试 pymssql库,该库到这里下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql## Author…

调查内存泄漏第1部分–编写泄漏代码

前几天,我发现了这个小问题:该服务器运行了一段时间,然后掉下来了。 然后通过启动脚本重新启动,整个过程重复进行。 这听起来并不那么糟糕,尽管对数据的损失很大,但对业务的重要性并不重要,因此…

js正整数正则表达式

function testNumber(){ var yourinputValue$("#yourinputId").val();var reg /^[1-9]\d*$/;alert(reg.test(yourinputValue))} 更多专业前端知识,请上 【猿2048】www.mk2048.com

python打印网页成pdf_vue中将网页打印成pdf

点击下载PDFimport html2canvas from html2canvasimport JSPDF from jspdfexport default {name: home,components: {chead},data () {return {msg: home}},methods: {getPdf: () > {let pdfDom document.querySelector(#home)html2canvas(pdfDom, {onrendered: function (…

[NOIP2013]火柴排队

嘟嘟嘟 首先可以想到,最小距离一定是a中第 i 大的和b中第 i 大的在同一行。 然后先把a,b分别离散化,然后开一个标记数组,map[i]记录a中第 i 小的数在哪一个位置出现,然后对b数组处理一遍。 题中说交换次数,…

.net core 上传文件大小限制 webconfig

<?xml version"1.0" encoding"utf-8"?><configuration> <location path"." inheritInChildApplications"false"> <system.webServer> <handlers> <add name"aspNetCore" path"*&qu…

python标准日期正则表达式_Python 正则表达式验证传统日期

Pure regular exprssion(?x)(?:(?#dd/mm)(3[0-1]|[12][0-9]|0?[0-9])/(1[0-2]|0?[1-9])|(?#mm/dd)(1[0-2]|0?[1-9])/(3[0-1]|[12][0-9]|0?[0-9]))/(?#yy or yyyy)(?:[0-9]{2})?[0-9]{2}Regex with procedural codedef dateCheck(sDate):import redaysinmonth (31, …

Orika:将JAXB对象映射到业务/域对象

这篇文章着眼于使用Orika将JAXB对象映射到业务域对象。 本月初&#xff0c; 我使用基于反射的Dozer讨论 了相同的映射用例 。 在本文中&#xff0c;我假设需要映射相同的示例类&#xff0c;但是它们将使用Orika而不是Dozer进行映射 。 Dozer和Orika旨在解决相同类型的问题&…

es6 语法 (函数扩展)

//函数参数默认值(more值后不能有参数) {function test(x,y world){console.log(默认值,x,y); }test(hello);// hello worldtest(hello,kill); //hello kill } //作用域概念 {let x test;function test2(x,y x){console.log(作用域,x,y);}test2(); // undefined undefined…

python递归必须要有_python如何递归生成树?

好像比較懂你的意思了, 試寫了一個 Tree, 不知道你覺得怎麼樣XDclass Tree:def __init__(self, name):self.name nameself.children {}def __iter__(self):return iter(self.children)def __str__(self):return self.namedef __repr__(self):return Tree("{}").for…

2018秋季C语言学习总结

转载于:https://www.cnblogs.com/noacgnnolife/p/10413255.html

java取非_java运算符 与()、非(~)、或(|)、异或(^)

1.位异或运算(^)运算规则是&#xff1a;两个数转为二进制&#xff0c;然后从高位开始比较&#xff0c;如果相同则为0&#xff0c;不相同则为1。比如&#xff1a;8^11.8转为二进制是1000&#xff0c;11转为二进制是1011.从高位开始比较得到的是&#xff1a;0011.然后二进制转为十…

JOOQ事实:从JPA批注到JOOQ表映射

JOOQ是一个简洁的框架&#xff0c;它解决了我在使用高级动态过滤查询时遇到的一个长期问题。 虽然Hibernate和JPA附带了一个有用的Criteria API&#xff08;我已经使用了很长一段时间&#xff09;&#xff0c;但是使用它们时所能做的却有一些可以理解的限制。 例如&#xff0c;…

解决Charles手机安装SSL证书后,获取到的接口为unknown,且乱码问题

按照正常流程将Charles安装并设置代理后&#xff0c;手机添加完代理并安装SSL证书&#xff0c;尝试抓取接口时&#xff0c;获取到的接口为unknown且返回内容乱码&#xff0c;如下图所示 解决办法&#xff1a; 在Proxy-SSL Proxying Settings-SSL Proxying下添加想要抓取的服务地…

Sum of Even Numbers After Queries

Solution: 转载于:https://www.cnblogs.com/Julietma/p/10414394.html

python的颜色有哪些_Python颜色分类及格式

Python字符串颜色使用下面方式进行修改\033[显示方式;字体色;背景色m 字符串 \033[0m显示方式包括&#xff1a;0 终端默认设置1 高亮显示4 使用下划线5 闪烁7 反白显示8 不可见字体颜色 | 背景颜色 | 颜色描述-------------------------------------------3…