问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何通过内存计数器发现应用中存在的内存泄漏现象?

发布网友 发布时间:2022-04-23 00:48

我来回答

1个回答

热心网友 时间:2022-04-18 23:30

一般来说内存泄漏有两种情况。一种情况,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。
可能光说概念太抽象了,大家可以看一下这样的例子:

1 Vector v=new Vector(10);
2 for (int i=1;i<100; i++){
3 Object o=new Object();
4 v.add(o);
5 o=null;
6 }

在这个例子中,代码栈中存在Vector对象的引用v和Object对象的引用o。在For循环中,我们不断的生成新的对象,然后将其添加到Vector对象中,之后将o引用置空。问题是当o引用被置空后,如果发生GC,我们创建的Object对象是否能够被GC回收呢?答案是否定的。因为,GC在跟踪代码栈中的引用时,会发现v引用,而继续往下跟踪,就会发现v引用指向的内存空间中又存在指向Object对象的引用。也就是说尽管o引用已经被置空,但是Object对象仍然存在其他的引用,是可以被访问到的,所以GC无法将其释放掉。如果在此循环之后,Object对象对程序已经没有任何作用,那么我们就认为此Java程序发生了内存泄漏。
尽管对于C/C++中的内存泄露情况来说,Java内存泄露导致的破坏性小,除了少数情况会出现程序崩溃的情况外,大多数情况下程序仍然能正常运行。但是,在移动设备对于内存和CPU都有较严格的*的情况下,Java的内存溢出会导致程序效率低下、占用大量不需要的内存等问题。这将导致整个机器性能变差,严重的也会引起抛出OutOfMemoryError,导致程序崩溃。

一般情况下内存泄漏的避免

在不涉及复杂数据结构的一般情况下,Java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度。我们有时也将其称为“对象游离”。
例如:

1 public class FileSearch{
2
3 private byte[] content;
4 private File mFile;
5
6 public FileSearch(File file){
7 mFile = file;
8 }
9
10 public boolean hasString(String str){
11 int size = getFileSize(mFile);
12 content = new byte[size];
13 loadFile(mFile, content);
14
15 String s = new String(content);
16 return s.contains(str);
17 }
18 }

在这段代码中,FileSearch类中有一个函数hasString,用来判断文档中是否含有指定的字符串。流程是先将mFile加载到内存中,然后进行判断。但是,这里的问题是,将content声明为了实例变量,而不是本地变量。于是,在此函数返回之后,内存中仍然存在整个文件的数据。而很明显,这些数据我们后续是不再需要的,这就造成了内存的无故浪费。
要避免这种情况下的内存泄露,要求我们以C/C++的内存管理思维来管理自己分配的内存。第一,是在声明对象引用之前,明确内存对象的有效作用域。在一个函数内有效的内存对象,应该声明为local变量,与类实例生命周期相同的要声明为实例变量……以此类推。第二,在内存对象不再需要时,记得手动将其引用置空。

复杂数据结构中的内存泄露问题

在实际的项目中,我们经常用到一些较为复杂的数据结构用于缓存程序运行过程中需要的数据信息。有时,由于数据结构过于复杂,或者我们存在一些特殊的需求(例如,在内存允许的情况下,尽可能多的缓存信息来提高程序的运行速度等情况),我们很难对数据结构中数据的生命周期作出明确的界定。这个时候,我们可以使用Java中一种特殊的机制来达到防止内存泄露的目的。
之前我们介绍过,Java的GC机制是建立在跟踪内存的引用机制上的。而在此之前,我们所使用的引用都只是定义一个“Object o;”这样形式的。事实上,这只是Java引用机制中的一种默认情况,除此之外,还有其他的一些引用方式。通过使用这些特殊的引用机制,配合GC机制,就可以达到一些我们需要的效果。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
孩子依赖性太强,妈妈怎么办?目录 孩子对妈妈依赖性太强怎么办 介绍权利的游戏里龙之母全名是什么? 澳洲血橙胶原蛋白是玻璃瓶的吗? 梦见母亲侄子妹妹舅妈电话破屋的预兆 梦见坐别人的车什么意思 有多少人去拜过“龙母”,又有几人知道“龙母”是真的存在过 龙母庙地址在哪里? 龙母像地址在哪里? 龙姥姥是龙母娘娘吗 怎样发现内存泄露? LoadRunner性能测试中,内存泄露通过什么指标来体现? 求助:在性能测试过程中,我们如何确定系统有内存溢出? Android开发中,有哪些好方法可以检测内存泄露和性能? iphone版uc浏览器被锁定横屏了 怎么解锁? 苹果手机可以下UC浏览器不,有必要下吗 电脑内存泄漏是怎么回事 苹果手机使用UC浏览器怎么进入小说阅读模式? 剃须刀上面的修鬓器是怎么样使用的??? 苹果手机里的UC浏览器怎么清理缓存? ios版uc浏览器哪个版本好 刮胡刀刮不干净,刮胡子步骤 苹果手机中的UC浏览器怎样在线观看视频? 剃须刀后面带了鬓毛修剪器怎么用直接推吗? 怎样下载苹果手机的uc浏览器 我这样可以用剃须刀每天刮能刮出鬓角么 苹果手机如何用uc浏览器下载视频? 飞利浦剃须刀RQ1050 鬓角刀如何用呀?用过的兄弟指点下哈 “苹果”手机可以下“UC浏览器”吗? 苹果手机不能用uc浏览器 您认为性能测试工作的目的是什么? 如何测试一个软件是否内存泄漏,怎么测试?具体点,各位大侠们!!! 1. 您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么? 什么是内在泄露...内存泄露了会有什么后果..?? Visual Leak Detector 内存泄露检测,该怎么处理 Android studio如何分析内存泄漏,是否有自带的分析工具 朋友分享一个百度云盘加密链接,密码给了,怎么通过链接下载文件呢? 百度网盘里,文件夹怎么设置密码? 苹果mac 账号怎么注销账号? 如何下载百度网盘中的文件(他人的) 百度网盘里文件有几种可以加密的方法,求高手解答 怎么注销苹果mac账号? 路由器怎么设置限制上网的时段 百度网盘分享所生成的链接任何人都可以下载吗?怎么把上传的文件加密?要输密码才能下载? MacBook怎么注销账号? 怎么设置路由器限制几个人连接! 百度云怎么加密文件 百度云管家隐藏空间怎么用 百度网盘怎么下载? 微信的“黑名单”是啥意思? 怎么设置路由器能限制别人连接wifi