Maison base de données tutoriel mysql 探究内存泄露—Part2—分析问题

探究内存泄露—Part2—分析问题

Apr 01, 2017 pm 02:44 PM

本文由ImportNew-黄索远翻译自captaindebug ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的Java开发小组。参与方式请查看小组简介。 如果你看过这篇博客的第一部分,就会知道在展示的内存泄露示例代码使用生产者-消费者模型创建了一个模拟

  本文由 ImportNew - 黄索远 翻译自 captaindebug

ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Java开发 小组。参与方式请查看小组简介。

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

下面向大家介绍分析程序内存泄露问题的三个步骤:

  1. 提取发生内存泄露的服务器的转储文件。

  2. 用这个转储文件生成报告。

  3. 分析生成的报告。

有几个工具能帮你生成堆转储文件,分别是:

  • jconsole

  • Jvisualvm

  • Eclipse Memory Analyser Tool(MAT)

用jconsole提取堆转储文件

将jconsole关联你的应用:单击MBeans选项卡打开com.sun.management包,点击HotSpotDiagnostic,点击Operations选择dumpHeap。这时你将会看到dumpHeap操作:它接受两个参数p0和p1。在p0的编辑框内输入一个堆转储的文件名,然后按下DumpHeap命令。

1386.png

用jvisualvm提取堆转储文件

连接示例代码,右键点击你的应用,在左侧的“application”窗格中选择“Heap Dump”。

注意:如果你在发生内存泄露的服务器上有一个远程连接,那么jvisualvm将会把转出文件保存在远程机器(假设这是一台unix机器)上的/tmp目录下。你不得不将这个文件通过FTP传送到你的机器上,然后再进行研究。

1387.png

用MAT来提取堆转储文件

jconsole和jvisualvm本身就是JDK的一部分,而MAT或者称作“内存分析工具”,是一个基于eclipse的工具。你可以从eclipse.org下载。

最新版本的MAT需要你在电脑上安装JDk1.6。如果你用的是Java1.7版本也不用担心,因为它会自动为你安装1.6版本,并且不会和安装好了的1.7版本产生冲突。

1388.png

使用MAT的时候,只需要点击“Aquire Heap Dump”,然后遵循指示就可以了。

1389.png

远程连接

-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
Copier après la connexion

何时提取堆转存文件

这需要耗费一点心力和运气。如果太早提取了堆转储文件,那么你将不能发现问题。因为它们被合法,非泄露类的实例屏蔽了。不过也不能等待太久,因为提取堆转储文件需要占用内存,进行提取操作的时候可能会导致你的应用崩溃。

1390.png

最好的办法是将jconsole连接到你的应用程序并监控堆的占用情况,知道它看起来像在崩溃的边缘。这样很容易就能监控到,因为没有发生内存泄露时,三个堆部分指标都是绿色的。

1391.png

分析转储文件

现在轮到MAT发挥作用了,因为它本身就是被设计用来分析堆转储文件的。要打开和分析一个堆转储文件,选择File选项下的Heap Dump选项。选择了你要打开的文件后,你将会看到如下三个选项:

1392.png

选择Leak Suspect Report选项。在MAT翻腾几秒后,会生成这样的一个页面:

1393.png

如饼状图显示:在示例中,疑似有一处发生了内存泄露。也许你会想,这样的做法只有在代码受到控制的情况下才可取。毕竟这只是个例子,这又能说明什么呢?好吧,我承认在这个例子里,所有的问题都是可见的;线程a占用了98.7MB内存,其他线程用了1.5MB。在实际情况中,你得到的图表是这样的。

下一步要做的就是挖得更深一点……

1394.png

如上图所示,报告的下一部分告诉我们,有一个LinkedBlockQueue占用了98.46%的内存。想要进一步的探究,点击Details>>。

1395.png

可以看到,问题确实是出在我们的orderQueue上。这个队列里存储了所有生成的虚拟命令,并且可以被我们上篇博文里提到的三个线程OrderFeed、OrderRecord、OrderMonitor访问。

那么一切都清楚了,MAT告诉我们:示例代码中有一个LinkedBlockQueue,这个队列用尽了所有的内存,从而导致了严重的问题。不过我们不知道这个问题为什么会产生,也不能指望MAT告诉我们。这个问题,如阿加莎·克里斯蒂笔下的赫尔克里·波洛所说,得用“泽灰色小细胞”解决……

 以上就是探究内存泄露—Part2—分析问题的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre la fuite de mémoire Win11. Analyse des causes de la fuite de mémoire Win11 et diverses solutions. Comment résoudre la fuite de mémoire Win11. Analyse des causes de la fuite de mémoire Win11 et diverses solutions. Feb 29, 2024 am 09:58 AM

Récemment, de nombreux amis qui utilisent le système Win11 ont constaté que la mémoire occupée par la fenêtre du bureau de leur ordinateur est très grande et qu'il y a également de graves fuites de mémoire, ce qui entraînera un retard d'exécution d'autres programmes et un fonctionnement incorrect. Pour résoudre ce problème, nous avons résolu ce problème. Comment les utilisateurs peuvent-ils le résoudre ? Nous ouvrons le panneau de configuration de l'ordinateur, cliquons pour sélectionner la fonction du bouton d'alimentation et décochons l'option Activer le démarrage rapide. Le redémarrage de l'ordinateur résoudra le problème. Il peut également y avoir un problème avec le pilote de la carte graphique. téléchargez le pilote. Causes des fuites de mémoire : les fuites de mémoire sont causées par des ressources mal alignées dans un programme informatique en raison d'une allocation de mémoire incorrecte. Cela se produit lorsque les emplacements RAM inutilisés ne sont toujours pas libérés. Ne confondez pas les fuites de mémoire avec les fuites d'espace ou les fuites de mémoire

Détection et résolution des fuites de mémoire de la fonction Golang Détection et résolution des fuites de mémoire de la fonction Golang Apr 23, 2024 pm 05:09 PM

Il y a une fuite de mémoire de fonction dans le langage Go, ce qui entraînera une consommation continue de mémoire et un crash de l'application. Nous pouvons utiliser le package runtime/pprof pour la détection et vérifier si une fonction contient accidentellement une référence à une ressource inutile. Pour résoudre une fuite de mémoire, nous devons trouver la référence qui a provoqué la fuite, généralement en inspectant le code de la fonction et en recherchant des variables globales ou des références de fermeture.

Analyse détaillée des problèmes courants de gestion de la mémoire en C++ Analyse détaillée des problèmes courants de gestion de la mémoire en C++ Oct 10, 2023 am 10:51 AM

C++ est un langage de programmation puissant, mais c'est aussi un langage qui nécessite une gestion minutieuse de la mémoire. Lors de l’écriture de programmes en C++, des problèmes de gestion de la mémoire sont souvent rencontrés. Cet article analysera en détail les problèmes courants de gestion de la mémoire en C++ et fournira des exemples de code spécifiques pour aider les lecteurs à comprendre et à résoudre ces problèmes. 1. Fuite de mémoire (MemoryLeak) Une fuite de mémoire signifie que la mémoire allouée dynamiquement dans le programme n'est pas libérée correctement, ce qui entraîne un gaspillage de ressources mémoire. Il s'agit d'un problème courant, en particulier sur les tirages importants ou longs.

Fuites de mémoire dans les applications PHP : causes, détection et résolution Fuites de mémoire dans les applications PHP : causes, détection et résolution May 09, 2024 pm 03:57 PM

Une fuite de mémoire PHP se produit lorsqu'une application alloue de la mémoire et ne parvient pas à la libérer, ce qui entraîne une réduction de la mémoire disponible du serveur et une dégradation des performances. Les causes incluent les références circulaires, les variables globales, les variables statiques et l'expansion. Les méthodes de détection incluent Xdebug, Valgrind et PHPUnitMockObjects. Les étapes de résolution sont les suivantes : identifier la source de la fuite, réparer la fuite, tester et surveiller. Des exemples pratiques illustrent les fuites de mémoire causées par des références circulaires et des méthodes spécifiques pour résoudre le problème en cassant les références circulaires via des destructeurs.

Comment résoudre le problème de la mémoire excessive et des fuites dans le système Linux Comment résoudre le problème de la mémoire excessive et des fuites dans le système Linux Jun 30, 2023 pm 02:21 PM

Comment gérer les problèmes fréquents d'utilisation élevée de la mémoire et de fuites dans les systèmes Linux. Lors du processus d'utilisation des systèmes Linux, nous rencontrons parfois des problèmes d'utilisation élevée de la mémoire et de fuites de mémoire. Ces problèmes peuvent entraîner des ralentissements du système, des pannes d’applications et même des pannes du système. Cet article explique comment résoudre ces problèmes. Tout d’abord, comprenons les concepts d’utilisation élevée de la mémoire et de fuites de mémoire. Utilisation élevée de la mémoire Une utilisation élevée de la mémoire signifie qu'il y a très peu de mémoire disponible dans le système, alors que la majeure partie de la mémoire est utilisée. Lorsque la mémoire est utilisée

Comment résoudre les problèmes courants de libération de mémoire dans les fonctions Java ? Comment résoudre les problèmes courants de libération de mémoire dans les fonctions Java ? May 02, 2024 am 09:57 AM

La gestion de la mémoire en Java implique un garbage collection, mais des problèmes peuvent toujours survenir. Les problèmes courants incluent les fuites de mémoire et la fragmentation de la mémoire. Les fuites de mémoire sont causées par des objets contenant des références qui ne sont plus nécessaires et peuvent être résolues en évitant les références circulaires, en utilisant des références faibles et en limitant la portée des variables. La fragmentation de la mémoire est provoquée par des allocations et des désallocations fréquentes et peut être résolue à l'aide de pools de mémoire, de pools d'objets volumineux et d'un garbage collection compact. Par exemple, l'utilisation de références faibles peut gérer les fuites de mémoire et garantir que le garbage collector récupère les objets lorsqu'ils ne sont plus nécessaires.

Notes de développement Golang : Comment éviter les problèmes de fuite de mémoire Notes de développement Golang : Comment éviter les problèmes de fuite de mémoire Nov 23, 2023 am 09:38 AM

Golang est un langage de développement rapide et efficace qui est très populaire pour ses puissantes capacités de concurrence et son mécanisme de récupération de place intégré. Cependant, même en développant avec Golang, il est toujours possible de rencontrer des fuites de mémoire. Cet article présentera quelques considérations courantes sur le développement de Golang pour aider les développeurs à éviter les problèmes de fuite de mémoire. Évitez les références circulaires Les références circulaires sont l'un des problèmes courants de fuite de mémoire dans Golang. Lorsque deux objets font référence l'un à l'autre, si les références à ces objets ne sont pas publiées à temps,

Parlez des risques potentiels liés au développement du langage Go Parlez des risques potentiels liés au développement du langage Go Mar 04, 2024 pm 03:33 PM

Langage de programmation rapide, efficace et simple à utiliser, le langage Go est de plus en plus privilégié par les développeurs. Cependant, comme tout langage de programmation, le développement du langage Go présente également certains risques potentiels. S'ils ne sont pas pris en compte et gérés, ils peuvent entraîner une diminution de la qualité du code et même des conséquences graves. Cet article explorera certains risques potentiels liés au développement du langage Go, les analysera et en discutera avec des exemples de code spécifiques. 1. Pièges du traitement simultané Le langage Go prend intrinsèquement en charge la programmation simultanée via goroutine et chann

See all articles