注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

是缘是情是童真

如果你用笑脸面对 你会看见别人的笑脸

 
 
 

日志

 
 

android GC  

2012-10-09 11:16:02|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
if you wanna a concrete example ,please refer to http://www.mysjtu.com/page/M0/S677/677822.html 

出现内存泄漏的可能性:

出现情况:
1. 数据库的cursor没有关闭

 资料性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不应用的时辰,应当及时封闭它们,以便它们的缓冲及时收受接管内存。它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外。若是我们仅仅是把它的引用设置为null,而不封闭它们,往往会造成内存泄漏。因为有些资料性对象,比如SQLiteCursor(在析构函数finalize(),若是我们没有封闭它,它本身会调close()封闭),若是我们没有封闭它,体系在收受接管它时也会封闭它,然则如许的效力太低了。是以对于资料性对象在不应用的时辰,应当调用它的close()函数,将其封闭掉,然后才置为null.在我们的应用退出时必然要确保我们的资料性对象已经封闭。


法度中经常会进行查询数据库的操纵,然则经常会有应用完毕Cursor后没有封闭的景象。


2.构造adapter时,没有使用缓存contentview
   衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程/

3.Bitmap对象没调用recycle()释放内存

Bitmap对象在不应用时,我们应当先调用recycle()开释内存,然后才它设置为null。

固然recycle()从源码上看,调用它应当能立即开释Bitmap的首要内存,然则测试成果显示它并没能立即开释内存。然则我它应当还是能大大的加快Bitmap的首要内存的开释。


4.activity中的对象的生命周期大于activity
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]



1. verbosegc

一般Java虚拟机要求支持verbosegc选项,输出详细的垃圾收集调试信息。dalvik虚拟机很安静的接受verbosegc选项,然后什么都不做。dalvik虚拟机使用自己的一套LOG机制来输出调试信息。 

如果在Linux下运行adb logcat命令,可以看到如下的输出: 
D/dalvikvm( 745): GC_CONCURRENT 
freed 199K, 53% free 3023K/6343K,external 0K/0K, paused 2ms+2ms 

其中D/dalvikvm表示由dalvikvm输出的调试信息,括号后的数字代表dalvikvm所在进程的pid。 

GC_CONCURRENT表示触发垃圾收集的原因,有以下几种:


 


  • GC_MALLOC, 内存分配失败时触发
  • GC_CONCURRENT,当分配的对象大小超过384K时触发
  • GC_EXPLICIT,对垃圾收集的显式调用(System.gc) 
  • GC_EXTERNAL_ALLOC,外部内存分配失败时触发


freed 199K表示本次垃圾收集释放了199K的内存, 

53% free 3023K/6343K,其中6343K表示当前内存总量,3023K表示可用内存,53%表示可用内存占总内存的比例。 

external 0K/0K,表示可用外部内存/外部内存总量 
paused 
2ms+2ms,第一个时间值表示markrootset的时间,第二个时间值表示第二次mark的时间。如果触发原因不是GC_CONCURRENT,这一行为单个时间值,表示垃圾收集的耗时时间。 

2. 分析

(1)虽然dalvikvm提供了一些调试信息,但是还缺乏一些关键信息,比如说mark和sweep的时间, 

分配内存失败时是因为分配多大的内存失败,还有对于SoftReference,WeakReference和PhantomReference的处理,每次垃圾收集处理了多少个这些引用等。 

(2)目前dalvik所有线程共享一个内存堆,这样在分配内存时必须在线程之间互斥,可以考虑为每个内存分配一个线程局部存储堆,一些小的内存分配可以直接从该堆中分配而无须互斥锁。 

(3)dalvik虚拟机中引入了concurrentmark,但是对于多核CPU,可以实现parrelmark,即可以使用多个线程同时运行mark阶段。 

这些都是目前dalvik虚拟机内存管理可以做出的改进。



参考:http://hi.baidu.com/gongting14/item/c1e4ae341f32f83b2e0f8199


  评论这张
 
阅读(850)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017