什么是引起内存泄露的原因 内存泄漏的原因是什么

> 问题详情
内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?
悬赏:0&答案豆
提问人:匿名网友
发布时间:
内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?
您可能感兴趣的试题
1如果有个100M大的文件,需要上传至服务器中,而服务器form表单最大只能上传2M,可以用什么方法?2在单线程模型中Message,Handler,Message Queue,Looper之间的关系是什么?3创建语句对象时,createStatement(参数1,参数2),两个参数分别表示什么含义?4如何获取游标所指的行的数据?
我有更好的答案
<a href="http://www.shangxueba.com/ask/9336110.html" target="_blank" title="当n=5时,下列函数的返回值是:()。[cpp] view plaincopyint foo(int n){if(n当n=5时,下列函数的返回值是:()。[cpp] view plaincopyint foo(int n){if(n<2)retu
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
每天只需0.4元
选择支付方式
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
恭喜你被选中为
扫一扫-免费查看答案!
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
提示:请截图保存您的账号信息,以方便日后登录使用。
常用邮箱:
用于找回密码
确认密码:51CTO旗下网站
Android内存泄漏的各种原因详解
在Android开发过程中,最为让我们头疼的就是内存的泄露问题了,很可能你很小的一个错误都会引起内存的泄露,下面将为大家奉上引起内存泄露的解决方案。
作者:佚名来源:eoe Android开发者社区| 10:16
1.资源对象没关闭造成的内存泄漏
资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于
java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄漏。因为有些资源性对象,比如
SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭),如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。因此对于资源性对象在不使用的时候,应该调用它的close()函数,将其关闭掉,然后才置为null.在我们的程序退出时一定要确保我们的资源性对象已经关闭。
程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
示例代码:
Cursor&cursor&=&getContentResolver().query(uri...);&&if&(cursor.moveToNext())&{&&...&...&&}&
修正示例代码:
Cursor&cursor&=&null;&&try&{&&cursor&=&getContentResolver().query(uri...);&&if&(cursor&!=&null&&&cursor.moveToNext())&{&&...&...&&}&&}&finally&{&&if&(cursor&!=&null)&{&&try&{&&cursor.close();&&}&catch&(Exception&e)&{&&&&}&&}&&}&
2.构造Adapter时,没有使用缓存的convertView
以构造ListView的BaseAdapter为例,在BaseAdapter中提供了方法:
public View getView(int position, ViewconvertView, ViewGroup parent)
来向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的
view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list
item的view对象会被回收,然后被用来构造新出现的最下面的list
item。这个构造过程就是由getView()方法完成的,getView()的第二个形参View convertView就是被缓存起来的list
item的view对象(初始化时缓存中没有view对象则convertView是null)。由此可以看出,如果我们不去使用
convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。
ListView回收list item的view对象的过程可以查看:
android.widget.AbsListView.java --& voidaddScrapView(View scrap) 方法。
示例代码:
public&View&getView(int&position,&ViewconvertView,&ViewGroup&parent)&{&&View&view&=&new&Xxx(...);&&...&...&&return&&&}&
修正示例代码:
public&View&getView(int&position,&ViewconvertView,&ViewGroup&parent)&{&&View&view&=&null;&&if&(convertView&!=&null)&{&&view&=&convertV&&populate(view,&getItem(position));&&...&&}&else&{&&view&=&new&Xxx(...);&&...&&}&&return&&&}&
3.Bitmap对象不在使用时调用recycle()释放内存
有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。可以看一下代码中的注释:
&&&&&&&&&&&&&&&&&
4.试着使用关于application的context来替代和activity相关的context
这是一个很隐晦的内存泄漏的情况。有一种简单的方法来避免context相关的内存泄漏。最显著地一个是避免context逃出他自己的范围之外。使用Application
context。这个context的生存周期和你的应用的生存周期一样长,而不是取决于activity的生存周期。如果你想保持一个长期生存的对象,并且这个对象需要一个context,记得使用application对象。你可以通过调用
Context.getApplicationContext() or
Activity.getApplication()来获得。更多的请看这篇文章如何避免
Android内存泄漏。
5.注册没取消造成的内存泄漏
一些Android程序可能引用我们的Anroid程序的对象(比如注册机制)。即使我们的Android程序已经结束了,但是别的引用程序仍然还有对我们的Android程序的某个对象的引用,泄漏的内存依然不能被垃圾回收。调用registerReceiver后未调用unregisterReceiver。
比如:假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在LockScreen中定义一个
PhoneStateListener的对象,同时将它注册到TelephonyManager服务中。对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。
但是如果在释放
LockScreen对象的时候忘记取消我们之前注册的PhoneStateListener对象,则会导致LockScreen无法被垃圾回收。如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得system_process
进程挂掉。
虽然有些系统程序,它本身好像是可以自动取消注册的(当然不及时),但是我们还是应该在我们的程序中明确的取消注册,程序结束时应该把所有的注册都取消掉。
6.集合中对象没清理造成的内存泄漏
我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条聚焦热点热点头条
24H热文一周话题本月最赞
讲师:427301人学习过
讲师:91676人学习过
讲师:153481人学习过
精选博文论坛热帖下载排行
本书是关于EJB 3.0的专业技术教程,专注于EJB的概念、方法、开发过程的介绍。同时,本书还研究许多高端的EJB知识,使得开发者能够真正理解...
订阅51CTO邮刊论文发表、论文指导
周一至周五
9:00&22:00
浅谈java内存泄露的具体原因和解决措施
  摘要:在众多高级编程语言中,Java具有程序高度安全的特点,越来越多的企业级应用系统采用Java技术开发,这些系统往往长时间运行,哪怕是很小量的内存泄露也有可能导致系统的崩溃,因此内存泄露的问题不容忽视。本文重点分析研究了Java内存泄露的原因及表现形式,并在此基础上提出了内存泄露的表现形式。中国论文网 http://www.xzbu.com/6/view-3251430.htm  关键词:Java;内存泄露;内存管理  基于安全性的考虑,很多网络程序的编写都采用Java程序设计技术,互联网最常见的编程语言就是Java。C、C++等高级编程语言容易产生内存泄露,这是因为编程人员需要自己对对象的产生和回收做出声明,而对象的回收一般都比较繁琐,容易产生内存的泄露。Java与其它高级编程语言不同,它自身带有垃圾收集器(英文全称Garbage Collector,简称GC),这种垃圾回收机制可以实现内存的自动管理与回收。正是基于这点考虑,许多编程人员都认为采用Java编程语言,就可以在管理创建对象的同时,不考虑内存方面的事情,且内存不会泄露,其实这种想法是不对的,采用Java仍然会有内存泄露问题出现。  一、为何会产生内存泄露  1、内存泄露的主观原因  在主观方面主要是人为因素造成的,比如编程人员的编程能力不足,或者编程时的专注度不够,这些都会使得错误或无意保持引用一些无用对象,进而造内存泄露的普遍发生。  2、内存泄露的客观原因  在客观方面主要是垃圾收集器的回收机制的作用,垃圾收集器对垃圾的判断法则与普通编程人员不同,例如,垃圾收集器认为垃圾都是一些不可达的对象,而其他一些有句柄指向的对象应该被认作正在使用的对象;普通编程人员认为垃圾是不再需要使用的对象,但是这些不再使用的对象还被其他正在使用的对象引用。这样就产生了判断准则的差异,普通编程人员认为应该回收的对象垃圾收集器不予回收。除此之外,垃圾收集器的参数设置要非常注意,如果设置出现差错容易导致内存泄露。  二、Java中内存泄露的主要表现  针对C、C++等传统语言回收对象的不方便,Java作了一个很突出的变革——引入了便捷的垃圾收集器的机制。垃圾收集器可以为编程人员分担内存管理工作,可以使编程人员从繁杂的对象回收工作中解脱出来从事关键的程序开发工作。在具体实践中,编程人员可以使用关键字new或者用Java的反射机机制,预留出一部分内存空间给对象,这个内存空间可以自动回收不再使用的对象。这种收支两条线的内存管理机制有效地解决了传统语言中的内存泄露问题,极大地提高了编程的效率。虽然垃圾收集器的引入带来了效率的提高,但是Java中仍然会出现的内存泄露的问题。与传统语言的内存泄露方式不同,Java的内存泄露是指某些对象不被需要和使用时,一些程序或代码仍然对其进行保持或引用,这样使得垃圾收集器无法回收这些垃圾对象占用的内存。这是由于垃圾收集器的垃圾对象判断机制认为这些对象仍然“有用”。  三、内存泄露的分析与处理方式  1、要做好提前预防内存泄露的工作  对于不同的JVM,垃圾回收机制和启动参数也各不相同,需要具体分析。有的垃圾收集器是在堆内存出现不足时收集垃圾,有的垃圾收集器是定时启动的,而有的垃圾收集器是当中央处理器的资源空闲时开始收集工作。要预防内存泄露,一定要优化好垃圾收集器的配置。垃圾收集器的参数和算法容易对程序产生重要影响,如果垃圾回收机制使用不当,或者参数配置不合理,都会形成内存泄露的隐患。  2、编程人员要养成良好的编程习惯  如果编程人员的水平较高,能够编写出高质量的代码,可以降低内存泄露的可能。减少内存泄露的可能性的最重要原则是,对于“无用”对象的引用应该尽快的予以释放,具体来说就是当某个对象不再使用,可以采用“对象=null”的方式进行显式释放对象,这样垃圾收集器可以快速回收这些对象占有的内存。要尽量少采用临时对象,因为临时对象的存活时间短,不再使用就及容易变成垃圾,如果使用过多地临时对象,垃圾收集器会频繁启动来进行内存回收,这样应用程序的性能必然受到影响。另外,要尽量避免在类的构造函数中创建大量对象,防止在调用其自类的构造方法时造成不必要的内存资源占用。最后,要避免过深的类层次结构和过深的方法调用,这两种方式都很浪费内存,容易影响应用程序得性能。  3、按系统运行环境调优JVM运行参数  系统内存环境的变化会对垃圾收集器产生影响,对于垃圾收集器的参数设置要根据具体的系统环境进行调整,要经过仔细测试找到最佳的参数。参数如果调整得当,垃圾收集器可以很平缓地释放内存空间,可以通过一些小步骤来对垃圾进行回收,这样垃圾收集器可以更高效的运行。垃圾收集器可以调整和优化的参数不仅多,而且具体设置过程也很复杂,具体操作需要借助一定的资料。  四、结语  综上所述,Java的内存泄露主要是由于一些无用对象被错误地保持着,导致它们的空间不能被GC回收造成的。本文通过对Java中GC工作的原理和产生内存泄露的原因进行的研究分析,希望为开发更优的Java应用提供一些参考。(作者单位:大连大学)
转载请注明来源。原文地址:
【xzbu】郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。
xzbu发布此信息目的在于传播更多信息,与本网站立场无关。xzbu不保证该信息(包括但不限于文字、数据及图表)准确性、真实性、完整性等。看看下面这段代码中内存泄露的原因是什么? - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
express = require(&#x27;express&#x27;)
http = require(&#x27;http&#x27;)
redis = require(&#x27;redis&#x27;).createClient()
async = require(&#x27;async&#x27;)
port = 3000
app = express()
server = http.createServer(app)
class Cache
constructor: -&
[@data](&#x2F;user&#x2F;data) = {}
get: (callback) -&
redis.get &#x27;1mb&#x27;, (err, content) =&
# 每次从redis取出1mb数据
[@data](&#x2F;user&#x2F;data)[Math.random()] = content
callback(null, content)
for i in [0..1000]
cache = new Cache
cache.get (err, content) -&
# 这个循环中的内存无法回收
app.get &#x27;&#x2F;&#x27;, (req, res) -&
# 但是通过外部程序curl 1000次这个server,内存是可以得到回收的
cache = new Cache
cache.get (err, content) -&
res.send(content)
server.listen(port)
console.log &server listen on #{port}&
这语法糖读起来好费劲.
我无法人肉讲这个所谓代码解析成js.
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的

我要回帖

更多关于 造成内存泄露的原因 的文章

 

随机推荐