如何解决内存泄漏怎么解决问题

主题 : iOS开发发现内存泄漏如何解决?
级别: 新手上路
UID: 531219
可可豆: 34 CB
威望: 34 点
在线时间: 140(时)
发自: Web Page
来源于&&分类
iOS开发发现内存泄漏如何解决?&&&
发现pop回来的页面并没有走dealloc方法&&于是乎想尽各种办法想解决问题 在网上查资料 将一般出现这种情况无非是1.NSTimer 2.block 循环强引用 3.delegate 强引用&&可是这三个问题我都改了 还是没有走dealloc方法&&有没有大牛可以指点一二 告诉我怎么才能找到哪里有问题&&要怎么解决这个问题?&&感激不尽! 在线等
级别: 新手上路
UID: 294615
可可豆: 53 CB
威望: 29 点
在线时间: 401(时)
发自: Web Page
如果不是用的ARC,你看看你push的时候,有没有释放。
级别: 新手上路
UID: 509879
可可豆: 289 CB
威望: 190 点
在线时间: 360(时)
发自: Web Page
一个一个方法屏蔽&&然后去看是、dealloc在屏蔽那个函数的时候执行,然后这个方法里你在看不出哪里有强引用问题,在继续屏蔽,最后找出泄露的地方。在解决 ,有的只是你觉得你解决了&& 其实还是存在的额,希望有帮助
级别: 新手上路
UID: 531219
可可豆: 34 CB
威望: 34 点
在线时间: 140(时)
发自: Web Page
回 2楼(我叫田) 的帖子
谢谢你的回答
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版Java中典型的内存泄露问题和解决方法
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Java中典型的内存泄露问题和解决方法,典型的内存泄露例子是一个没有实现hasCode和
equals方法的Key类在HashMap中保存的情况,可以通过实现Key类的equals和hasCode方法解决这种内存泄漏问题,需要的朋友可以参考下
Q:在Java中怎么可以产生内存泄露?A:Java中,造成内存泄露的原因有很多种。典型的例子是一个没有实现hasCode和equals方法的Key类在HashMap中保存的情况。最后会生成很多重复的对象。所有的内存泄露最后都会抛出OutOfMemoryError异常,下面通过一段简短的通过无限循环模拟内存泄露的例子说明一下。
代码如下:import java.util.HashMimport java.util.Mpublic class MemoryLeak {&public static void main(String[] args) {& Map&Key, String& map = new HashMap&Key, String&(1000);& int counter = 0;& while (true) {&&&&&& // creates duplicate objects due to bad Key class&& map.put(new Key("dummyKey"), "value");&& counter++;&& if (counter % 1000 == 0) {&&& System.out.println("map size: " + map.size());&&& System.out.println("Free memory after count " + counter&&&&& + " is " + getFreeMemory() + "MB");&&& sleep(1000);&& }&&& & }&}&// inner class key without hashcode() or equals() -- bad implementation&static class Key {& private S& public Key(String key) {&& this.key =& }&}&//delay for a given period in milli seconds&public static void sleep(long sleepFor) {& try {&& Thread.sleep(sleepFor);& } catch (InterruptedException e) {&& e.printStackTrace();& }&}&//get available memory in MB&public static long getFreeMemory() {& return Runtime.getRuntime().freeMemory() / (1024 * 1024);&}}
结果如下:
代码如下:map size: 1000Free memory after count 1000 is 4MBmap size: 2000Free memory after count 2000 is 4MBmap size: 1396000Free memory after count 1396000 is 2MBmap size: 1397000Free memory after count 1397000 is 2MBmap size: 1398000Free memory after count 1398000 is 2MBmap size: 1399000Free memory after count 1399000 is 1MBmap size: 1400000Free memory after count 1400000 is 1MBmap size: 1401000Free memory after count 1401000 is 1MB..........map size: 1452000Free memory after count 1452000 is 0MBmap size: 1453000Free memory after count 1453000 is 0MBException in thread "main" java.lang.OutOfMemoryError: Java heap space&at java.util.HashMap.addEntry(HashMap.java:753)&at java.util.HashMap.put(HashMap.java:385)&at MemoryLeak.main(MemoryLeak.java:10)
Q:怎么解决上面的内存泄露?A:实现Key类的equals和hasCode方法。& 代码如下:&&& .....static class Key {&private S&public Key(String key) {& this.key =&}&&@Override&public boolean equals(Object obj) {& if (obj instanceof Key)&& return key.equals(((Key) obj).key);& else&&&}&@Override&public int hashCode() {& return key.hashCode();&}}.....&
&重新执行程序会得到如下结果:& 代码如下:&map size: 1Free memory after count 1000 is 4MBmap size: 1Free memory after count 2000 is 4MBmap size: 1Free memory after count 3000 is 4MBmap size: 1Free memory after count 4000 is 4MB...Free memory after count 73000 is 4MBmap size: 1Free memory after count 74000 is 4MBmap size: 1Free memory after count 75000 is 4MB&
Q:在实际场景中,你怎么查找内存泄露?A:通过以下代码获取线程ID
代码如下:C:\&jps5808 Jps4568 MemoryLeak3860 Main
通过命令行打开jconsole
代码如下:C:\&jconsole 4568
实现了hasCode和equals的Key类和没有实现的图表如下所示:没有内存泄露的:
造成内存泄露的:
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&下次自动登录
现在的位置:
&#160;&#160;&#160; C++程序对内存资源的管理,直接影响到整个程序的性能。内存泄漏可以说是每一个程序员的天敌。然后只要了解C++的特性,养成良好的编程习惯,我们还是可以将这种风险降至最低的。为了使自己编写的程序内存资源管理更加安全可靠,故写此文,总结几个内存资源管理的绝招。
1. 用类指针(point-like)对象代替原始指针(raw point)
大家都清楚,要对于C#,指针是C++的一种特性。使用指针能给我们带来巨大的方便,但如果使用不旦,内存动态分配以后没有及时收回,那么系统的内存资源极有可能泄漏,直至造成程序崩溃。
class A {……};&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //定义一个类型A
定义好一个对象后,我们一般可以用new方法,来创造一个对象实例。
&#160;&#160;&#160; A *pA = new A;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //动态分配一个内存,用new方法,相应的就需要调用delete方法,将该内存进行回收.
然而,在大量的程序代码中,直接针对每一个new,使用一个delete的方式,存在以下几个问题:
1)&#160; 程序进行维护期间,开发人员若不慎增加循环、条件控制流语句,程序在未触及到delete时,就运行了
2) 在new和delete之间,由于运行了某些操作,导致出现异常。
因此,我们不能百分百保证,delete语句总是会执行。为了确保内存资源总是能够回收,我们可以将指针,用一个对象来进行操作,从而利用C++的“析构函数自动调用机制”自动释放内存资源。在标准的程序库中,提供了auto_ptr和tr1::shared_ptr两种指针对象,我们也可以称之为智能指针,采用这种指针对象,当对象的生命周期结束时,其析构函数将自动调用delete。其用法如下:
std::auto_ptr&A& pA(new A);&#160;
std::tr1::shared_ptr&A& pA(new A);&#160;
这两个指针对象的区别之处在于:多个auto_ptr不能同时指向同一对象;而多个shared_ptr则可以指向同一对象。正是因为这个不同,造成两者在处理copy构造函数和copy assignment操作符时,也不尽相同。auto_ptr的复行为具有特殊性:
std::auto_ptr&A& pA1(new A);&#160;
std::auto_ptr&A& pA2(pA1);&#160;&#160;&#160;&#160;&#160; //pA2指向对象,而pA1为空
pA1 = pA2;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //pA1指向对象,而pA2为空
2. 成对使用new与delete时应采用相同的形式
一般来讲,new方法可以用于创建单对对象,也可以用于创建数组对象。同样,针对单个对象与数组,调用delete的形式也不尽相同。如下所示的一个例子,就是new与delete调用形式不匹配,从而造成内存没有成功释放。
string* sArray = new string[100];&#160;
……&#160;
delete sA&#160;
由于sArray是一个数组,因而上述的100个string对象,就必须调用100次析构函数才能完全释放内存,因而正确的做法是:
delete [] sA&#160;
因此,如果你在new表达式中使用[ ],必须在相应的delete表达式中也使用[ ]。如果你在new表达式中不使用[ ],那相应的delete表达式也不能使用[ ]。
3. 在独立的语句中构建智能指针
考虑到如下的函数:
void f(std::tr1::shared_ptr&A& pA(new A), fun());&#160;
编译器在调用f函数的具体内容前,首先要处理被传递的各个实参。上述第一个参由两部分构成:执行new A,然后调用std::tr1::shared_ptr构造函数。所在编译器在调用f之前,必须做三件事:
1. 调用函数fun
2. 执行new A
3. 调用tr1::shared_ptr构造函数
然后,对于C++来讲,编译器的执行顺序是不确定的,如果最终的操作顺序是这样:
1. 执行new A
2. 调用函数fun
3. 调用tr1::shared_ptr构造函数
如果是这样,假如在调用函数fun时,发现了异常,此时new A返回的指针将会遗失,而且没有放入tr1::shared_ptr中,所以就可能在调用这个函数时引发内存泄漏。为了避免这种问题,一般采用两条语句来实现上述代码,如下:
std::tr1::shared_ptr&A& pA(new A);&#160;
f(pA, fun());&#160;
【上篇】【下篇】
您可能还会对这些文章感兴趣!
外部的引用: 1 条
关于VS2008中C/C++内存泄漏的定位的方法 & 求索阁
百度站内搜索
同分类最新文章

我要回帖

更多关于 ios内存泄漏怎么解决 的文章

 

随机推荐