内存泄漏

合集下载

程序运行时出现的内存泄漏解决方法

程序运行时出现的内存泄漏解决方法

程序运行时出现的内存泄漏解决方法内存泄漏是指在程序运行中,开辟的内存没有被正确地释放,导致显存空间逐渐耗尽,最终会引发程序崩溃。

内存泄漏在计算机程序中是一个非常常见的问题,对程序的性能和稳定性产生着重要影响。

本文将从内存泄漏的原因、危害以及解决方法进行分析和探讨。

内存泄漏的原因内存泄漏是由于程序在开辟内存时,没有释放内存,导致内存池中的空间一直被占用,最终会导致程序的崩溃。

内存泄漏的原因常见以下几种:1. 代码错误:程序中编写的代码有误,导致新开辟的内存没有被正确释放。

2. 结构体赋值问题:程序中的结构体赋值错误,导致内存没有被正确释放。

3. 函数调用误差:在函数调用时,没有正确地释放内存,导致内存泄漏。

4. 指针操作错误:在程序运行时,指针的操作出现错误,导致内存泄漏。

内存泄漏的危害内存泄漏是一种非常严重的问题,对程序的性能和稳定性产生非常大的影响。

具体表现在以下几个方面:1. 程序崩溃风险:由于内存泄漏导致内存池中的空间不足,程序会在运行时频繁崩溃。

2. 节点浪费:程序中大量的节点在内存中产生,却又不能释放,导致内存的浪费。

3. 程序运行效率降低:如果内存泄漏较为严重,系统中的资源会被迅速占用,导致程序运行效率降低。

内存泄漏的解决方法1. 手动检测内存泄漏:程序运行期间,通过对内存的监测和追踪,进行人工检查,找到内存泄漏的原因并进行修复。

2. 使用内存检测工具:利用内存检测工具可以检查出内存泄漏的位置和原因,进而进行修复。

3. 引入智能指针:智能指针是一种新型的内存管理方式,它可以通过自动管理内存的方式,避免程序中的内存泄漏问题。

4. 使用多线程管理技术:多线程管理技术可以避免程序在运行的过程中产生内存泄漏问题,提高程序的稳定性。

5. 翻阅内存泄漏相关的文档或书籍:查找到与内存泄漏有关的文档或书籍,在不断学习的过程中,逐步解决程序运行时出现的内存泄漏问题。

总结内存泄漏对程序的性能和稳定性产生着重要的影响,它需要注意和管理。

内存泄漏测试方法

内存泄漏测试方法

内存泄漏测试方法内存泄漏是软件开发中常见的问题,它指的是程序在运行过程中未能正确释放已经分配的内存空间,导致该空间无法再被其他部分使用,从而造成内存的浪费。

如果内存泄漏问题长期存在,将会导致系统性能下降,甚至引发程序崩溃。

因此,进行内存泄漏测试对于软件开发至关重要。

一、什么是内存泄漏?内存泄漏是指在程序运行过程中,本应释放的内存资源没有得到释放,导致这部分内存无法再被其他部分使用。

这可能是由于程序设计错误、资源管理不当、程序逻辑错误等原因造成的。

内存泄漏会导致系统性能下降,甚至引发程序崩溃。

二、内存泄漏的危害1. 系统性能下降:内存泄漏会导致系统内存不足,进而使系统性能下降。

当内存泄漏问题严重时,系统可能会变得非常缓慢,甚至无法正常运行。

2. 程序崩溃:内存泄漏会导致内存资源耗尽,当系统无法再分配内存给程序时,程序可能会崩溃。

这对于一些关键的应用程序,如操作系统、数据库等,将是致命的。

3. 安全漏洞:内存泄漏可能导致敏感数据泄露,攻击者可以通过分析内存中的数据来获取系统的敏感信息,例如密码、私钥等。

三、内存泄漏的测试方法1. 静态分析:通过对代码进行静态分析,寻找可能存在内存泄漏的代码段。

静态分析工具可以帮助开发人员在编译阶段发现潜在的内存泄漏问题。

2. 动态测试:动态测试是指在程序运行过程中监测内存的分配和释放情况,以及检测内存泄漏的存在。

常用的动态测试工具有Valgrind、Dr.Memory等。

3. 压力测试:通过模拟大量用户并发访问系统,观察系统在高并发情况下是否存在内存泄漏问题。

压力测试可以帮助开发人员发现系统在极限情况下的内存泄漏问题。

4. 内存泄漏分析工具:使用专门的内存泄漏分析工具,如LeakCanary、MemoryAnalyzer等,来检测和分析内存泄漏问题。

这些工具可以帮助开发人员快速定位内存泄漏的原因和位置。

5. 代码审查:通过对代码进行审查,寻找可能存在内存泄漏的代码段。

内存泄漏 越界判定方法

内存泄漏 越界判定方法

内存泄漏越界判定方法
以下是 8 条关于“内存泄漏越界判定方法”的内容:
1. 嘿,你知道吗,咱可以通过定期检查内存使用情况来判定内存泄漏呀!就像你会时不时看看自己的钱包还剩多少钱一样。

比如在运行程序的过程中,时不时瞅瞅内存占用是不是异常增长了。

2. 哇塞,还可以利用一些专门的工具来检测内存泄漏呢!这就好比有个超级侦探帮你找线索。

像那种能精确分析内存状态的工具,一用就能发现不对劲的地方。

3. 哎呀呀,观察程序运行时的行为表现也能察觉到内存泄漏哦!比如说程序突然变得特别卡或者不稳定,这难道还不能引起你的警觉吗?就像一个人突然无精打采,肯定有问题呀!
4. 嘿哟,对内存分配和释放进行跟踪也是个好办法呀!这不就像你知道自己每一笔开销和收入一样清楚嘛。

看看哪个地方分配了没释放,那不就是内存泄漏的嫌疑嘛!
5. 你晓得不,检查代码中的指针操作也很关键呢!指针就像个爱乱跑的小孩,要是没管好可就出问题啦。

比如看看有没有指针指向了不该指的地方。

6. 哇哦,注意程序中的动态分配内存也很重要哦!这就像在给自己的小空间不断加东西,得小心别放多了或者放错地方呀。

要是一直分配却不释放,那可不得了。

7. 呀,还可以关注一些异常的错误消息呢!这就像是身体发出的警报信号呀。

当出现奇怪的内存相关错误时,难道还不赶紧去查查是不是有内存泄漏或越界呀!
8. 嘿!对内存区域进行边界检查也能发现越界问题呀!这就好比设了个安全围栏,要是超出了范围,那可不中!比如在读写数据时检查一下是不是超出了该有的范围。

总之,内存泄漏和越界问题可得重视起来,用这些方法就能让它们无所遁形!。

内存泄漏的解决方法

内存泄漏的解决方法

内存泄漏的解决方法什么是内存泄漏?在编程中,内存泄漏指的是程序在分配了一块内存后,由于某种原因未能释放该内存,导致这块内存无法再被程序使用。

随着时间的推移,这些未释放的内存会累积起来,最终导致系统资源耗尽。

内存泄漏可以发生在任何编程语言中,包括C、C++、Java、Python等。

它是一种常见的编程错误,在长时间运行的程序中尤其容易出现。

内存泄漏的原因内存泄漏通常由以下几个原因引起:1.未释放动态分配的内存:当使用malloc、new等函数动态分配内存时,必须记得在使用完毕后手动释放该内存。

如果忘记释放或者释放位置不正确,就会导致内存泄漏。

2.循环引用:当两个或多个对象之间存在相互引用关系,并且没有被其他对象所引用时,这些对象就会形成一个循环引用。

如果这些对象没有正确地被销毁或解除引用,就会导致内存泄漏。

3.资源未关闭:在使用一些需要手动关闭的资源时,比如文件、数据库连接、网络连接等,如果没有正确关闭这些资源,就会导致内存泄漏。

4.缓存问题:在使用缓存时,如果没有合理地管理缓存的大小和生命周期,就会导致内存泄漏。

特别是当缓存中的对象被长时间闲置而没有被清理时,就会造成内存泄漏。

如何解决内存泄漏?解决内存泄漏是一个复杂的过程,需要仔细分析代码并进行适当的优化。

下面列出了一些常用的方法来解决内存泄漏问题:1. 使用自动垃圾回收机制一些高级编程语言(如Java、Python)提供了自动垃圾回收机制,可以自动检测和释放不再使用的内存。

通过使用这些语言提供的垃圾回收器,可以大大减少内存泄漏的可能性。

2. 显式释放内存对于那些不支持自动垃圾回收的编程语言(如C、C++),需要手动释放动态分配的内存。

确保在使用完毕后调用适当的函数(如free、delete)来释放分配的内存。

3. 避免循环引用在设计程序时,要避免出现循环引用的情况。

如果确实需要使用循环引用,可以考虑使用弱引用来打破循环引用链。

4. 及时关闭资源在使用需要手动关闭的资源时,确保在不再需要时及时关闭它们。

如何解决电脑内存泄漏问题

如何解决电脑内存泄漏问题

如何解决电脑内存泄漏问题电脑内存泄漏是一种常见的问题,它会导致系统变慢、程序崩溃或者系统崩溃。

然而,许多人在遇到这个问题时并不知道该如何解决。

本文将介绍一些常见的解决方法,帮助您应对电脑内存泄漏问题。

一、了解内存泄漏的原因内存泄漏是由于程序在分配内存后未能正确释放内存,导致内存占用越来越高,最终耗尽系统内存。

内存泄漏的常见原因包括:未释放对象、未关闭文件或网络连接、循环引用等。

只有了解内存泄漏的原因,才能更好地解决问题。

二、使用内存泄漏检测工具为了更方便地发现和解决内存泄漏问题,可以使用专门的内存泄漏检测工具。

这些工具可以帮助您检测出哪些部分的代码导致内存泄漏,并提供相应的解决方法。

一些常用的内存泄漏检测工具包括Valgrind、Xcode Instruments等。

三、规范编程习惯良好的编程习惯可以有效地预防和解决内存泄漏问题。

首先,要养成分配内存后立即释放的习惯,确保每个分配的内存块都能在不再使用时被及时释放。

其次,要避免过多地使用全局变量,因为全局变量在程序运行期间一直存在,容易导致内存泄漏。

最后,要避免使用无限循环或者递归调用,防止产生无法释放的内存。

四、及时关闭文件和网络连接在程序中使用文件和网络连接时,一定要及时关闭它们,以避免内存泄漏问题。

当一个文件或网络连接不再需要时,应该显式地关闭它们,释放相关的内存资源。

未关闭的文件或网络连接将占据系统内存,最终导致内存泄漏。

五、处理循环引用循环引用是指多个对象之间相互引用,导致无法释放内存的情况。

在使用某些编程语言时,如果两个对象相互引用,并且没有其他对象引用它们,那么它们就会形成循环引用。

为了避免这种情况,可以使用弱引用或者手动解除引用的方式来解决循环引用问题。

六、定期清理缓存在程序中使用缓存是一种常见的做法,但是如果不及时清理缓存,就会导致内存泄漏。

因此,建议定期清理不再使用的缓存,释放占用的内存空间。

可以根据实际情况设定清理缓存的策略,例如在程序启动或者关闭时进行清理,或者在内存使用达到一定阈值时进行清理。

内存泄漏的检测定位和解决经验总结

内存泄漏的检测定位和解决经验总结

内存泄漏的检测定位和解决经验总结内存泄漏是指程序在运行过程中,分配的内存没有被正确释放,导致内存资源无法被再次利用的情况。

由于没有及时释放内存,内存泄漏会导致系统的内存消耗不断增加,最终可能造成程序崩溃或者系统运行缓慢。

解决内存泄漏问题需要进行检测、定位和解决。

一、内存泄漏的检测1. 使用内存分析工具:可以使用一些专门的内存分析工具来检测内存泄漏问题,例如Valgrind、Memcheck等。

这些工具可以跟踪程序运行过程中的内存分配和释放,帮助定位内存泄漏的位置。

2.编写测试用例:通过编写一些针对性的测试用例,模拟程序运行过程中常见的内存分配和释放场景,观察内存的使用情况。

如果发现内存占用持续增长或者没有被及时释放,就可以判断存在内存泄漏问题。

3.监控系统资源:通过监控系统的资源使用情况,如内存占用、CPU使用率等,可以观察系统是否存在内存泄漏的迹象。

如果发现系统的内存占用不断增加,并且没有明显的释放情况,就需要进一步检查是否存在内存泄漏。

二、内存泄漏的定位1.使用日志输出:通过在程序中添加日志输出语句,记录程序运行过程中的重要信息,特别是涉及内存分配和释放的地方。

通过观察日志输出,可以发现是否有内存没有被正确释放的情况。

2.代码分析:通过代码分析,找出可能导致内存泄漏的地方。

常见的内存泄漏问题包括:不恰当的内存分配和释放顺序、不正确的内存释放方式、内存分配大小不匹配等。

对于涉及动态分配内存的地方,要特别关注是否有被遗漏的释放操作。

3.堆栈跟踪:当发现内存泄漏问题比较复杂或者难以定位时,可以使用堆栈跟踪来追踪内存分配和释放的调用路径,找出内存泄漏的具体位置。

在调试过程中,可以通过打印调用栈来获取函数调用的过程,进而确定哪个函数没有正确释放内存。

三、内存泄漏的解决1.及时释放内存:在程序中,所有动态分配的内存都需要及时释放。

对于每个内存分配操作,都要确保相应的释放操作存在,并且在适当的时候进行调用。

内存泄漏攻击原理

内存泄漏攻击原理

内存泄漏攻击原理内存泄漏攻击原理什么是内存泄漏?内存泄漏是指在程序运行过程中,申请的内存空间没有被及时释放,导致这部分内存无法再被程序使用,从而造成内存资源的浪费。

内存泄漏的危害•浪费资源:内存泄漏会导致可用内存减少,系统性能下降,甚至可能导致系统崩溃。

•程序异常:内存泄漏会导致内存错误,如访问已释放的内存,导致程序崩溃或产生未定义行为。

•安全风险:内存泄漏可以被恶意攻击者利用,进行内存泄漏攻击,获取敏感信息或执行恶意代码。

内存泄漏攻击的原理内存泄漏攻击是指通过有意识地制造并利用内存泄漏问题,获取系统中的敏感信息或执行恶意代码。

攻击者通常会利用以下原理进行攻击:1. 未及时释放资源攻击者会故意编写代码,在申请了一些资源后,不主动释放这些资源,从而造成内存泄漏。

常见的资源包括内存、文件句柄、网络连接等。

2. 跨越安全边界攻击者利用未释放资源的漏洞,将敏感信息泄露给攻击者自己或第三方。

例如,攻击者可以通过内存泄漏来获取用户名、密码等敏感数据。

3. 重复申请资源攻击者通过重复申请资源的方式,逐渐消耗系统的可用内存。

当系统内存不足时,可能导致系统崩溃或拒绝服务。

4. 恶意代码注入攻击者利用内存泄漏漏洞,将恶意代码注入到受攻击系统的内存中,并成功执行。

这样的攻击可以导致系统受到控制,从而造成各种严重后果。

5. 溢出攻击攻击者故意制造内存溢出漏洞,通过向缓冲区写入超过其容量的数据,覆盖相邻内存的内容或执行恶意代码。

这种攻击手法可以绕过系统的安全检测和过滤,造成严重的安全风险。

如何预防内存泄漏攻击•编写规范的代码:合理使用内存管理工具,包括动态内存分配和释放。

•及时释放资源:在不使用资源时,主动进行资源的释放,避免资源的持久占用。

•安全边界检查:验证用户输入,避免发生缓冲区溢出等安全问题。

•使用安全的编程语言和框架:选择安全性较高的编程语言和框架,减少内存泄漏的发生。

•定期进行安全测试:对系统进行定期的安全测试和代码审查,及时发现和修复潜在的内存泄漏漏洞。

电脑内存泄漏该如何诊断和修复

电脑内存泄漏该如何诊断和修复

电脑内存泄漏该如何诊断和修复在我们日常使用电脑的过程中,可能会遇到各种各样的问题,其中内存泄漏就是一个比较常见但又让人头疼的情况。

内存泄漏指的是程序在运行过程中,不断地分配内存但没有及时释放不再使用的内存,导致可用内存逐渐减少,最终可能会使系统性能下降,甚至出现程序崩溃的情况。

那么,当我们遇到电脑内存泄漏时,该如何诊断和修复呢?下面就让我们一起来探讨一下。

一、内存泄漏的症状在诊断内存泄漏之前,我们首先需要了解一些内存泄漏可能导致的症状。

以下是一些常见的表现:1、系统运行速度逐渐变慢随着时间的推移,您可能会发现电脑的响应速度变得越来越慢,打开程序、文件或进行其他操作时都需要更长的时间。

2、频繁出现内存不足的错误提示当内存泄漏严重时,系统可能会弹出“内存不足”的警告,提示您关闭一些程序以释放内存。

3、程序崩溃或异常退出某些程序可能会突然崩溃,或者在运行过程中出现异常错误,无法正常工作。

4、系统重启或死机如果内存泄漏问题非常严重,可能会导致系统重启甚至死机,使您正在进行的工作丢失。

二、诊断内存泄漏的方法当我们怀疑电脑存在内存泄漏问题时,可以通过以下几种方法来进行诊断:1、任务管理器在 Windows 系统中,我们可以通过按下 Ctrl + Shift + Esc 组合键打开任务管理器。

在“性能”选项卡中,可以查看当前的内存使用情况。

如果发现内存使用率一直处于高位,并且在关闭一些程序后仍然没有下降,那么就有可能存在内存泄漏。

2、资源监视器Windows 系统还提供了资源监视器工具,可以更详细地查看内存的使用情况。

按下 Win + R 键,输入“resmon”并回车即可打开。

在资源监视器中,可以查看每个进程的内存使用情况,包括提交大小、工作集、私有工作集等。

通过观察这些数据的变化,可以判断是否有进程存在内存泄漏。

3、性能监视器通过性能监视器(在 Windows 系统中可以在控制面板中找到),我们可以创建一个自定义的性能计数器来监测内存的使用情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

发布时间:2006.04.19 16:46 来源:java家() 作者:< iframe border=0 marginWidth=0 marginHeight=0src="http://219.239.88.50:80/adsunion/get/;pl=pl-20-pip-software;tp=if;sk=0;ck=0;/?" frameBorder=0noResize width=1 scrolling=no height=1>< /iframe>抽象尽管java虚拟机和垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄漏的情况。

的确,在大型工程中,内存泄漏是一个普遍问题。

避免内存泄漏的第一步,就是要了解他们发生的原因。

这篇文章就是要介绍一些常见的缺陷,然后提供一些非常好的实践例子来指导你写出没有内存泄漏的代码。

一旦你的程序存在内存泄漏,要查明代码中引起泄漏的原因是很困难的。

同时这篇文章也要介绍一个新的工具来查找内存泄漏,然后指明发生的根本原因。

这个工具容易上手,可以让你找到产品级系统中的内存泄漏。

垃圾回收(GC)的角色虽然垃圾回收关心着大部分的问题,包括内存管理,使得程序员的任务显得更加轻松,但是程序员还是可能犯些错误导致内存泄漏问题。

GC(垃圾回收)通过递归对所有从"根"对象(堆栈中的对象,静态数据成员,JNI句柄等等)继承下来的引用进行工作,然后标记所有可以访问的活着的对象。

而这些对象变成了程序唯一能够操纵的对象,其他的对象都被释放了。

因为GC使得程序不能够访问那些被释放的对象,所以这样做是安全的。

内存管理可以说是自动的,但是这并没有让程序员脱离内存管理问题。

比方说,对于内存的分配(还有释放)总是存在一定的开销,尽管这些开销对程序员来说是暗含的。

一个程序如果创建了很多对象,那么它就要比完成相同任务而创建了较少对象的程序执行的速度慢(其他提供的内容都相同)。

导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。

如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器验证这些对象是否不再需要。

正如我们前面看到的,如果存在对象的引用,这个对象就被定义为"活着的",同时不会被释放。

要确定对象所占内存将被回收,程序员就要务必确认该对象不再会被使用。

典型的做法就是把对象数据成员设为null或者从集合中移除该对象。

注意,当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。

从更高一个层次看,这就是所有存在内存管的语言对内存泄漏所考虑的事情,剩余的对象引用将不再会被使用。

典型泄漏既然我们知道了在java中确实会存在内存泄漏,那么就让我们看一些典型的泄漏,并找出他们发生的原因。

全局集合在大型应用程序中存在各种各样的全局数据仓库是很普遍的,比如一个JNDI-tree或者一个session table。

在这些情况下,注意力就被放在了管理数据仓库的大小上。

当然是有一些适当的机制可以将仓库中的无用数据移除。

可以有很多不同的解决形式,其中最常用的是一种周期运行的清除作业。

这个作业会验证仓库中的数据然后清除一切不需要的数据。

另一个办法是使用引用计算。

集合用来对了解每个集合入口关联器(referrer)的数目负责。

这要求关联器通知集合什么时候完成进入。

当关联器的数目为零时,就可以移除集合中的相关元素。

高速缓存高速缓存是一种用来快速查找已经执行过的操作结果的数据结构。

因此,如果一个操作执行很慢的话,你可以先把普通输入的数据放入高速缓存,然后过些时间再调用高速缓存中的数据。

高速缓存多少还有一点动态实现的意思,当数据操作完毕,又被送入高速缓存。

一个典型的算法如下所示:1.检查结果是否在高速缓存中,存在则返回结果;2.如果结果不在,那么计算结果;3.将结果放入高速缓存,以备将来的操作调用。

这个算法的问题(或者说潜在的内存泄漏)在最后一步。

如果操作伴随着一个不同的,输入非常大的数字,那么存入高速缓存的也是一个非常大的结果。

那么这个方法就不是能够胜任的了。

为了避免这种潜在的致命错误设计,程序就必须确定高速缓存在他所使用的内存中有一个上界。

因此,更好的算法是:1.检查结果是否在高速缓存中,存在则返回结果;2.如果结果不在,那么计算结果;3.如果高速缓存所占空间过大,移除缓存中旧的结果;4.将结果放入高速缓存,以备将来的操作调用。

通过不断的从缓存中移除旧的结果,我们可以假设,将来,最新输入的数据可能被重用的几率要远远大于旧的结果。

这通常是一个不错的设想。

这个新的算法会确保高速缓存的容量在预先确定的范围内。

精确的范围是很难计算的,因为缓存中的对象存在引用时将继续有效。

正确的划分高速缓存的大小是一个复杂的任务,你必须权衡可使用内存大小和数据快速存取之间的矛盾。

另一个解决这个问题的途径是使用ng.ref.SoftReference类坚持将对象放入高速缓存。

这个方法可以保证当虚拟机用完内存或者需要更多堆的时候,可以释放这些对象的引用。

类装载器Java类装载器创建就存在很多导致内存泄漏的漏洞。

由于类装载器的复杂结构,使得很难得到内存泄漏的透视图。

这些困难不仅仅是由于类装载器只与"普通的"对象引用有关,同时也和对象内部的引用有关,比如数据变量,方法和各种类。

这意味着只要存在对数据变量,方法,各种类和对象的类装载器,那么类装载器将驻留在JVM中。

既然类装载器可以同很多的类关联,同时也可以和静态数据变量关联,那么相当多的内存就可能发生泄漏。

定位内存泄漏常常地,程序内存泄漏的最初迹象发生在出错之后,得到一个OutOfMemoryError在你的程序中。

这种典型地情况发生在产品环境中,而在那里,你希望内存泄漏尽可能的少,调试的可能性也达到最小。

也许你的测试环境和产品的系统环境不尽相同,导致泄露的只会在产品中揭示。

这种情况下,你需要一个低内务操作工具来监听和寻找内存泄漏。

同时,你还需要把这个工具同你的系统联系起来,而不需要重新启动他或者机械化你的代码。

也许更重要的是,当你做分析的时候,你需要能够同工具分离而使得系统不会受到干扰。

一个OutOfMemoryError常常是内存泄漏的一个标志,有可能应用程序的确用了太多的内存;这个时候,你既不能增加JVM的堆的数量,也不能改变你的程序而使得他减少内存使用。

但是,在大多数情况下,一个OutOfMemoryError 是内存泄漏的标志。

一个解决办法就是继续监听GC的活动,看看随时间的流逝,内存使用量是否会增加,如果有,程序中一定存在内存泄漏。

详细输出有很多办法来监听垃圾回收器的活动。

也许运用最广泛的就是以:-Xverbose:gc选项运行JVM,然后观察输出结果一段时间。

[memory] 10.109-10.235: GC 65536K->16788K (65536K), 126.000 ms箭头后的值(在这个例子中 16788K)是垃圾回收后堆的使用量。

控制台观察这些无尽的GC详细统计输出是一件非常单调乏味的事情。

好在有一些工具来代替我们做这些事情。

The JRockit Management Console可以用图形的方式输出堆的使用量。

通过观察图像,我们可以很方便的观察堆的使用量是否伴随时间增长。

Figure 1. The JRockit Management Console管理控制台甚至可以配置成在堆使用量出现问题(或者其他的事件发生)时向你发送邮件。

这个显然使得监控内存泄漏更加容易。

内存泄漏探测工具有很多专门的内存泄漏探测工具。

其中The JRockit Memory Leak Detector可以供来观察内存泄漏也可以针对性地找到泄漏的原因。

这个强大的工具被紧密地集成在JRockit JVM中,可以提供最低可能的内存事务也可以轻松的访问虚拟机的堆。

专门工具的优势一旦你知道程序中存在内存泄漏,你需要更专业的工具来查明为什么这里会有泄漏。

而JVM是不可能告诉你的。

现在有很多工具可以利用了。

这些工具本质上主要通过两种方法来得到JVM的存储系统信息的:JVMTI和字节码使用仪器。

Java虚拟机工具接口(JVMTI)和他的原有形式JVMPI(压型接口)都是标准接口,作为外部工具同JVM进行通信,搜集JVM的信息。

字节码使用仪器则是引用通过探针获得工具所需的字节信息的预处理技术。

通过这些技术来侦测内存泄漏存在两个缺点,而这使得他们在产品级环境中的运用不够理想。

首先,根据两者对内存的使用量和内存事务性能的降级是不可以忽略的。

从JVM获得的堆的使用量信息需要在工具中导出,收集和处理。

这意味着要分配内存。

按照JVM的性能导出信息是需要开销的,垃圾回收器在搜集信息的时候是运行的非常缓慢的。

另一个缺点就是,这些工具所需要的信息是关系到JVM的。

让工具在JVM开始运行的时候和它关联,而在分析的时候,分离工具而保持JVM运行,这显然是不可能的。

既然JRockit Memory Leak Detector是被集成到JVM中的,那么以上两种缺点就不再适用。

首先,大部分的处理和分析都是在JVM中完成的,所以就不再需要传送或重建任何数据。

处理也可以在垃圾回收器的背上,他的意思是提高速度。

再有,内存泄漏侦测器可以同一个运行的JVM关联和分离,只要JVM在开始的时候伴随着 -Xmanagement选项(这个允许监听和管理JVM通过远程JMX接口)。

当工具分离以后,工具不会遗留任何东西在JVM中;JVM就可以全速运行代码就好像工具关联之前一样。

趋势分析让我们更深一步来观察这个工具,了解他如何捕捉到内存泄漏。

在你了解到代码中存在内存泄漏,第一步就是尝试计算出什么数据在泄漏--哪个对象类导致泄露。

The JRockit Memory Leak Detector通过在垃圾回收的时候,计算每个类所包含的现有的对象来达到目的。

如果某一个类的对象成员数目随着时间增长(增长率),那么这里很可能存在泄漏。

Figure 2. The trend analysis view of the Memory Leak Detector因为一个泄漏很可能只是像水滴一样小,所以趋势分析必须运行足够长的一段时间。

在每个短暂的时间段里,局部类的增加会使得泄漏发生推迟。

但是,内存事务是非常小的(最大的内存事务是由在每个垃圾回收时从JRockit向内存泄漏探测器发送的一个数据包组成的)。

内存事务不应该成为任何系统的问题--甚至一个在产品阶段全速运行的程序。

一开始,数字会有很大的跳转,随时间的推进,这些数字会变得稳定,而后显示哪些类会不断的增大。

相关文档
最新文档