内存泄漏分析_调查内存泄漏第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的Blog博客上分析我们的JCG合作伙伴 Roger Hughes 的问题 。

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

内存泄漏分析

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

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

相关文章

将Java Flight Recorder与OpenJDK 11结合使用

Java Flight Recorder(JFR)曾经是Oracle JDK的商业附加组件。 由于它是与Java Mission Control一起最近开源的,因此使用OpenJDK 11的每个人现在都可以使用此出色的工具免费对Java应用程序进行故障排除。 JFR以前是专有解决方案,对…

c语言开发工具程序代码是什么文件,【C语言】开发工具--GCC使用入门

来自: 51CTO GCC使用入门通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编…

无服务器安全性:将其置于自动驾驶仪上

Ack :本文是从个人经验以及从无服务器安全性的其他多个来源学到的东西的混合。 我无法在这里列出或确认所有这些信息; 但是,应该特别感谢The Register , Hacker Noon , PureSec以及Serverless Status和Serverless&…

c语言构造报文,构造一个缓冲区溢出的C语言的例子

满意答案wk05122013.06.01采纳率:45% 等级:12已帮助:15719人#include #include #include void function(char *str){char buffer[16];strcpy(buffer, str);}void evilfunc(){printf("Am I Evil?\n");}int main(int argc, char*…

mongodb插入速度每秒_MongoDB事实:商品硬件上每秒插入80000次以上

mongodb插入速度每秒在尝试一些时间序列集合时,我需要一个大型数据集来检查我们的聚合查询在增加数据负载的情况下不会成为瓶颈。 我们解决了5000万份文档,因为超出此数目我们仍然会考虑分片。 每次事件如下所示: {"_id" : Objec…

parallels for linux,在 Parallels Desktop 上安装 Remix OS PC

前言个人觉得呢,像 Remix OS 和 Phoenix OS 这样的国产安卓桌面操作系统还是很划时代的。赋予了安卓平台多任务操作的能力,这可以给二合一设备的体验带来一定的变化,但是不像 Surface 一样后面有巨硬给撑腰可以做大做强起来,但是这…

模拟用户输入并检查输出的简单方法

最近,我的一些学生向我询问了赫尔辛基大学MOOC提供的单元测试的机制,我检查了它们的实现,并认为这对于初学者了解实际发生的情况是有帮助的,因此在此发表了这篇小文章。 我们将以“机场”项目为例,这是OOP2第一周的最…

android bench内存测试,华为p10内存测试软件(androbench) v5.0.1 免费版

华为p10内存测试软件(androbench)其实是androbench这款内存测试软件,可以用于测试你的华为p10,是一款不错的华为p10内存测试软件,可以测试你的手机闪存性能,其他的手机也可以免费测试哦。华为p10内存测试软件介绍AndroBench是衡量…

android对话框字体大小,Android Dialog 设置字体大小的具体方法

先看下面图片:这是我在做登录页面的时候,调用系统的progressdialog 进行等待,可是看起来很不协调,左边的等待图片过大,右边文字过小,看起来老别扭,虽然功能上不存在什么问题,但是我有…

android custom toast,Android自定义Toast

核心代码:package com.huatec.myapplication;import android.content.Context;import android.graphics.Bitmap;import android.support.annotation.ColorInt;import android.support.annotation.DrawableRes;import android.view.Gravity;import android.view.Layo…

华为android打开usb调试模式,华为 PE-CL00 开启USB调试模式

我们要将华为 PE-CL00与电脑进行连接,就必须要打开华为 PE-CL00系统的调试模式,不同的系统版本打开调试模式的方法有所不同,在这里我们就谈谈华为 PE-CL00各种系统版本打开USB调试模式的方法。1、针对Android 2.1-2.2版本的系统:我…

API网关和AWS Lambda进行身份验证

当Foreach最初涉足微服务领域时,我们并没有真正构建微服务。 我们以为我们做到了,但是我们所有的服务中总存在一些逻辑。 当然,每个服务实际上应该只专注于自己的任务,而不应该专注于属于另一个微服务的事物。 我们这方面最明显的…

魅蓝x android 7,魅蓝x2什么时候发布 魅蓝x2发布时间最新消息

日前,魅蓝品牌掌门人李楠或kkk便在微博上放出“bluegate(蓝色大门)”这样一个句子,似乎暗示魅蓝品牌或在近期会有动作,并且由于该条微博的尾巴显示为“下款魅蓝Android”,所以在不少网友看来,或许预示着魅蓝将有新机即…

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

内存泄漏代码前几天,我发现了这个小问题:该服务器运行了一段时间,然后掉下来了。 然后通过启动脚本重新启动,整个过程重复进行。 听起来并没有什么坏处,因为它虽然对数据造成了重大损失,但对业务的重要性并…

Java整数缓存-为什么Integer.valueOf(127)== Integer.valueOf(127)为True

在一次采访中,我的一个朋友被问到如果我们有两个Integer对象, Integer a 127; Integer b 127; Integer a 127; Integer b 127; 为什么当a b都持有两个单独的对象时,其值为true ? 在本文中,我将尝试回答这个问题&a…

怎么删除计算机管理员用户密码,小编手把手教你Win10系统如何删除管理员账户密码...

一位用户反馈自己在windows10正式版系统电脑中设置了管理员账户密码,之后每次开机都需要输入密码才可以登录,感觉十分麻烦。那么,Win10系统下该如何删除管理员账户密码?接下来,系统之家小编就为大家分享下具体操作方法…

Hibernate事实:始终检查Criteria API SQL查询

Criteria API对于动态构建查询非常有用,但这是我使用它的唯一用例。 每当您有一个带有N个过滤器且可以以任意M个组合到达的UI时,就应该有一个API动态地构造查询,因为连接字符串始终是我所不愿使用的路径。 问题是,您是否知道您的…

以Spring方式构建企业Java应用程序

我认为可以肯定地说, Java EE在Java开发人员中享有很高的声誉。 尽管多年来确实在各个方面都有所改善,甚至将其改名为Eclipse Foundation成为Jakarta EE ,但其苦味仍然相当浓厚。 另一方面,我们拥有Spring框架 (或者为…

jaxb 映射 空字段_推土机:将JAXB对象映射到业务/域对象

jaxb 映射 空字段Dozer是开放源代码( Apache 2许可 )“ Java Bean到Java Bean映射器,可将数据从一个对象递归复制到另一个对象”。 正如从其主页上的描述所描述的那样,它用于映射两个JavaBeans实例,以在实例之间进行自…

常用计算机网络性能指标的是什么,什么是Bit?【计算机网络的性能指标】

比特(英语:Bit),亦称二进制位,指二进制中的一位,是信息的最小单位。因此一个比特就是二进制数字中的一个 1 或 0Bit是Binary digit(二进制数字)的缩写,由数学家John Wilder Tukey提出(可能是1946年提出,但有…