最后在实现一个无限循环的ViewPager,展示图片,功能实现了,但是运行一段时间之后会挂掉。

多亏了AndroidStudio的Memory Monitor,发现了内存一直在增长。

记一次内存泄露排查

怎么触发gc内存都不会减少,确定了内存泄露了,但是不知哪里出问题了。

 

一时想到的排查内存泄露的工具,就是MAT了,但是没找到AndroidStudio的MAT插件。

只能先把java heap dump出来先,如下图所示

记一次内存泄露排查

dump出来之后,hprof文件会保存在项目下captures目录,之前一直不知到,找了很久。。。

如果切换到Captures这个tab,是可以直接看到HeapSnapshot的,如下图所示

记一次内存泄露排查

但是这个hprof文件mat不认,需要转换一下,点击hprof文件右键,转成标准.hprof文件即可

 

 记一次内存泄露排查

然后到eclipse用mat插件打开,如果没有安装mat插件请自行搜索解决

window->open perspective->memory analysis

在memory analysis界面下

File->Open Heap Dump->选中上面Android Studio转换之后的.hprof文件即可

在OverView下面点击Top Consumers, 如下图。byte占了大头,内存基本都给它用了

记一次内存泄露排查

byte占用这么多内存,一想到的就是bitmap没被释放了。

回去研究我的代码

PagerAdapter代码如下

 1 public class SlidePicPagerAdapter extends PagerAdapter {
 2 
 3     private List<SlidePicModel> mItems;
 4     private int itemSize;
 5 
 6     public void setItems(List<SlidePicModel> items) {
 7         mItems = items;
 8         itemSize = items.size();
 9     }
10 
11     @Override
12     public int getCount() {
13         return ListUtils.isEmpty(mItems) ? 0 : Integer.MAX_VALUE;
14     }
15 
16     @Override
17     public boolean isViewFromObject(View view, Object object) {
18         return view == object;
19     }
20 
21     @Override
22     public Object instantiateItem(ViewGroup container, int position) {
23         Context context = container.getContext();
24         SlidePicModel item = mItems.get(getCurPos(position));
25         ImageView iv = item.getImageView();
26         if(iv == null){
27             iv = new ImageView(context);
28             item.setImageView(iv);
29         }
30         final String imgUrl = ImageUrlExtends.getImageUrl(item.getUrl());
31         Picasso.with(context).load(imgUrl).into(iv);
32         container.addView(iv);
33         return iv;
34     }
35 
36     @Override
37     public void destroyItem(ViewGroup container, int position, Object object) {
38         View imageView = (View) object;
39         container.removeView(imageView);
40     }
41 
42 
43     private int getCurPos(int pos){
44         return pos % mItems.size();
45     }
46 }
View Code

相关文章: