s********k 发帖数: 6180 | 1 大牛来讲讲,android里面memory leak一般都是什么导致的? |
f*******t 发帖数: 7549 | |
z****e 发帖数: 54598 | |
k******e 发帖数: 19 | 4 非大牛,做安卓多年时常遇到这个烂问题,MEMORY LEAK其实大多是MEMORY NOT
RELEASE SOON ENOUGH,就是留了太多暂时没用的东西在MEMORY里,比如说你用VIEW
PAGER,用FragmentPagerAdapter的话所有的Fragment都不释放,要是用
FragmentStatePagerAdapter那就可以用setOffscreenPageLimit选留几个Fragment。还
有一个常LEAK的就是IMAGE,要是不小心就放一堆BITMAP不RELEASE,立马死菜,最好就
是老实用现成的轮子,比如说PICASSO。出问题就老实地用工具查吧,总能找到症结的。
【在 s********k 的大作中提到】 : 大牛来讲讲,android里面memory leak一般都是什么导致的?
|
k******e 发帖数: 19 | 5 哦,忘记了还有这个很早以前安卓TEAM就一直在喊的不要LEAK CONTEXT,
http://android-developers.blogspot.com/2009/01/avoiding-memory-
这个算是官方的“小心注意事项“。
的。
【在 k******e 的大作中提到】 : 非大牛,做安卓多年时常遇到这个烂问题,MEMORY LEAK其实大多是MEMORY NOT : RELEASE SOON ENOUGH,就是留了太多暂时没用的东西在MEMORY里,比如说你用VIEW : PAGER,用FragmentPagerAdapter的话所有的Fragment都不释放,要是用 : FragmentStatePagerAdapter那就可以用setOffscreenPageLimit选留几个Fragment。还 : 有一个常LEAK的就是IMAGE,要是不小心就放一堆BITMAP不RELEASE,立马死菜,最好就 : 是老实用现成的轮子,比如说PICASSO。出问题就老实地用工具查吧,总能找到症结的。
|
s********k 发帖数: 6180 | 6 多谢各位大牛,引用一般大家都做成strong?还是softreference? |
s********k 发帖数: 6180 | 7 我的意思一般什么用strong reference,就是那些singleton?哪些适合用
softreference?
【在 s********k 的大作中提到】 : 多谢各位大牛,引用一般大家都做成strong?还是softreference?
|
k******e 发帖数: 19 | 8 很少需要用到softreference, weakrefernce or phantomreference,一般是在你需要
cache一堆东西,比如说图片,的时候会要用到。但是强烈建议不要自己重写image
cache一类的东西,用Picasso或者Fresco什么的比较成熟的东西。有时候有人也喜欢用
weak reference去包装一个context object,比如说activity什么的以避免前面说的“
小心leak context”的问题。
但是很多时候这都是可以用别的办法达成,比如说那个weak reference wrap activity
,一般都是用async task的时候在task完成后的callback里要update UI,用这个避免
activity在async task没完成前就被释放了。但是这种做法是比较老式的做法,现在很
多新的pattern都会用个service(一般用intent service)去完成放在async task里的
任务,完成后可以用local broadcast manager发布个公告,在activity里面register
listener去收听,用这样的机制虽然好像复杂了很多,但是更加合理。
还有就是memory usage,只要你合理地用了persistence layer(一般就用sqlite+
content provider, or you can try realm.io or CouchBase Mobile),那你就不会占
用过多的内存,也就不太会出现out of memory的问题了。你看那个Cursor,都有个1MB
limit,就是很好的对内存用量的控制,让你不会过多地不必要地耗费内存。总之就是
只把你需要的东西给LOAD到内存里,不要的就及时释放(合理地利用CursorLoader,
CursorAdapter这一类的HELPER,他们都有帮助你自动释放不需要的那部分内存的功能
)。
【在 s********k 的大作中提到】 : 我的意思一般什么用strong reference,就是那些singleton?哪些适合用 : softreference?
|
s********k 发帖数: 6180 | 9 多谢,但是我看android官方文档强烈不建议用softreference做cache啊。
activity
register
【在 k******e 的大作中提到】 : 很少需要用到softreference, weakrefernce or phantomreference,一般是在你需要 : cache一堆东西,比如说图片,的时候会要用到。但是强烈建议不要自己重写image : cache一类的东西,用Picasso或者Fresco什么的比较成熟的东西。有时候有人也喜欢用 : weak reference去包装一个context object,比如说activity什么的以避免前面说的“ : 小心leak context”的问题。 : 但是很多时候这都是可以用别的办法达成,比如说那个weak reference wrap activity : ,一般都是用async task的时候在task完成后的callback里要update UI,用这个避免 : activity在async task没完成前就被释放了。但是这种做法是比较老式的做法,现在很 : 多新的pattern都会用个service(一般用intent service)去完成放在async task里的 : 任务,完成后可以用local broadcast manager发布个公告,在activity里面register
|
k******e 发帖数: 19 | 10 没错,就是因为很多人用SOFT REFERENCE等做CACHING TO AVOID MEMORY LEAK,所以别
人专门说别这样。所以说用PICASSO什么的处理图片CACHE(里面也就一类似LRUCACHE的
东西,不过除了MEMORY CACHE还有PERSISTENCE LAYER CACHE),其他什么的CACHE就像
文档说的用LRUCACHE什么的。
一般应该很少用到SOFTREFERENCE和WEAKREFERNCE等。
【在 s********k 的大作中提到】 : 多谢,但是我看android官方文档强烈不建议用softreference做cache啊。 : : activity : register
|
l**********n 发帖数: 8443 | 11 多线程吧。
【在 s********k 的大作中提到】 : 大牛来讲讲,android里面memory leak一般都是什么导致的?
|