扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
简单的说就是android的一个内存分析工具。帮助优化你的app。
公司主营业务:网站建设、做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出弥渡免费做网站回馈大家。
MAT(Memory Analyzer Tool),一个内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。
你可以把它集成到android studio或者Eclipse里面。然后使用它分析你的app。具体的使用方法你可以网上搜索。
1、新建测试应用
1
新建一个Android 测试应用。
填写好应用的名称,以及保存位置后,直接下一步到最后点击“Finish”。
2
添加一个测试Activity:Activity2。
3
添加测试代码ActivityHelper:
这里用常用的线程长时间执行,导致外部Activity Destroy时还持有 activity的内容导致内存泄露。
主要代码如下:
public class ActivityHelper {
private Context mContext;
public ActivityHelper(Context context) {
this.mContext=context;
}
/** * 打印ActivityName */
public void printActivityName() {
for (int i = 0; i 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true)
try {
Thread.sleep(1000*30);
Log.d(ActivityHelper.class.getSimpleName(), ((Activity) mContext).getClass().getSimpleName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}}
4
在Activity2中的onCreate方法中调用单例:
new ActivityHelper().printActivityName();
然后再MainActivity中点击“Setting”菜单栏打开Activity2:
Intent intent=new Intent(MainActivity.this,Activity2.class);startActivity(intent);
最后按返回键返回。
按照以上操作,运行程序。
5
多次进入Activity2之后会发现内存一直在增长,并没有降低。
而且log里会不停的输出log,打印当前activity的name
END
2、抓取内存信息
1
点击Android Studio工具栏上得“Android Device Monitor”,打开后如图:
2
先在android设备上打开我们的应用
然后在devices里选中我们测试的应用,点击“update heap”
3
来回点击“settings”进入Activity2数次后,点击
“DUMP HPROF file”保存文件。
4
转换HPROF文件。
利用android sdk 的工具进行转换:
到sdk/platform-tools/目录下,打开终端输入:
./hprof-conv
/Users/xxx/Desktop/gc/com.lulee007.androidmemoryleakdemo.hprof
/Users/xxx/Desktop/gc/com.lulee007.androidmemoryleakdemo.out.hprof
进行转换.
最终得到这个文件:com.lulee007.androidmemoryleakdemo.out.hprof
END
3、使用Memory Analyzer 分析
下载Memory Analyzer 工具:
到官网下载:
选择合适的版本。
打开软件:
从工具栏打开phrof文件选择“File”"open heap dump"
点击下面的“Action”里的“Histogram”,然后搜索ActivityHelper
得到如下结果
右击其中的一个,选择“Merge Shortest Paths to GC Roots ”"exclude all phantom/weak/soft etc references.."
可以看到,ActivityHelper本应该被释放,但是因为thead持有其中的mContext,而context是activity2里的,所有造成了内存泄露。
解决方法:
合理用thread,当activity2,destroy时,需要及时的停止掉thread。
可以设置activityhelper的while(true)改为设置变量,如while(notshutdown),
然后再destory里调用activityhelper,设置其notshutdown为false即可。
千锋扣丁学堂Android开发为您解答:
1、mat是matlab的数据文件,可以直接双击导入
或者通过命令窗输入命令以及编写m文件导入
如果是当前目录下的文件file1.mat,直接输入load file1
如果不是当前目录下的,输入 load(['目录\file1.mat'])
如果file1里含有a,b,c这三个变量
导入后数据空间里,就直接存在a,b,c这三个量。
2、mat数据格式是matlab的数据存储的标准格式。mat文件是标准的二进制文件,还可以ASCII码形式保存和加载。
3、MATLAB是解释型语言,就是说MATLAB命令行中敲入的命令在当前MATLAB进程中被解释运行。但是,每次执行一个任务时敲入长长的命令序列是很烦人的。有两种方法可以使MATLAB的力量得到扩展——脚本和函数。这两种方法都用像emacs一样的文本编辑器中编写的m文件(因为扩展名是.m所以这样命名,m文件还称点m文件)。m文件的好处在于它可以保存命令,还可以轻易地修改命令而无需重新敲入整个命令行。
第一步:下载Eclipse MAT
第二步:下载之后将压缩包解压,放置到Myeclipse 的\MyEclipse 9\dropins目录下
解压后会看见这些文件: 纠正下面一个错别字不是"写"是 "下"
第三步:按照下图,A,B,C的顺序进行对应的文件的创建
第四部:重启Myeclipse,打开Window-Perferences,你会看见这个项目:
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流