MemoryAnalyzer的介绍及使用请参见:
Android 内存泄漏分析
编写如下代码(就是一个按钮加一个imageview,不停地点击button,就会翻转90度图片)
Bitmapbt;
@Override
protectedvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rotate = (Button)
findViewById(R.id.button1);
view = (ImageView)
findViewById(R.id.imageView1);
view.setDrawingCacheEnabled(true);
rotate.setOnClickListener(newOnClickListener()
{
@Override
publicvoidonClick(Viewarg0)
{
//
TODO Auto-generated method stub
bt =
drawableToBitmap(view.getDrawable());
view.setImageBitmap(rotateBitmap(bt,90));
view.setDrawingCacheEnabled(true);
//bt.recycle();
//bt = null;
}
});
}
效果执行如下:
使用DDMS插件进行进程内存跟踪:
运行一段时间以后,导出当前进程中的内存快照文件。
打开 memery analyzer进行内存文件分析
转换一下,内存dump文件的格式(android
虚拟机与java虚拟机差异)
工具分析的内存疑似泄漏点:
发现疑似第二处为应用的泄漏点:
Android 常见内存泄漏错误
1、集合中对象没清理造成的内存泄露
我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
2、资源对象没关闭造成的内存泄露
资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄露。因为有些资源性对象,比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭),如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。因此对于资源性对象在不使用的时候,应该调用它的close()函数,将其关闭掉,然后才置为null.在我们的程序退出时一定要确保我们的资源性对象已经关闭。
举例(隐形cursor的close释放资源)
Cursor c = getServerIdCursor(serverId);
try {
if (c.moveToFirst()) {
Uri uri = ContentUris.withAppendedId(
RawContacts.CONTENT_URI, c.getLong(0));
uri = Uri.withAppendedPath(uri,
RawContacts.Entity.CONTENT_DIRECTORY);
EntityIterator entityIterator = RawContacts
.newEntityIterator(mContentResolver.query(
uri, null, null, null, null));
if (entityIterator.hasNext()) {
entity = entityIterator.next();
}
entityIterator.close();//
释放cursor防止内存泄漏 fix by
// jhy
userLog("Changing contact ", serverId);
}
} finally {
if (c != null) {
userLog("Changing contact releaseing------ cursor!");
c.close();
c = null;
}
}
3、Bitmap没调用recycle()
Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.
虽然recycle()从源码上看,调用它应该能立即释放Bitmap的主要内存,但是测试结果显示它并没能立即释放内存。但是我它应该还是能大大的加速Bitmap的主要内存的释放。
4、代码内跨activity对象引用造成的对象还被引用,释放不了。
android SoftReference WeakReference的使用
Soft Reference
虽然和 Weak Reference 很类似,但是用途却不同。被 Soft Reference
指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM
内存不足时且没有 Direct Reference
时才会清除,SoftReference 是用来设计 object-cache
之用的。如此一来 SoftReference 不但可以把对象 cache
起来,也不会造成内存不足的错误(OutOfMemoryError)
http://www.cnblogs.com/charley_yang/archive/2010/10/22/1857926.html
分享到:
相关推荐
Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对 ...
java 内存泄露检测工具 MemoryAnalyzer 堆内存检测 tomcat内存泄露检测 jvm内存泄露检测
Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减少内存占用。 使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对象...
MemoryAnalyzer主要用于分析jvm运行过程中导致内存溢出、内存泄漏的工具,MemoryAnalyzer主要用于分析jvm运行过程中导致内存溢出、内存泄漏的工具,MemoryAnalyzer主要用于分析jvm运行过程中导致内存溢出、内存泄漏...
MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory Analyzer Tool,用来帮助分析内存泄漏和减少内存消耗。使用MAT分析Java堆快照,可以快速计算出对象的保留大小(Retained Sizes),查找到阻止对象被回收...
MemoryAnalyzer软件可以帮你进行发现或者分析调试的代码等无法进行修复的问题;支持分析内存问题.;支持监控整个 Java 应用程序的状态与行为.还可以进行读取,使应用程序运行时可以支持让Java 运行时环境的生产
Android 内存泄露原因分析。通过原因分析,再接合代码可查明具体原因,发现对策
Android 内存泄露 Mat工具分析。非常好的分析工具讲解
MemoryAnalyzer又名MAT,用于android内存泄漏的hprof文件解析
MAT Eclipse Memory Analyzer 中文文档 PDF 共 93 页 MAT Eclipse Memory Analyzer 中文文档 PDF 共 93 页
Eclipse Memory Analyzer是一款基于Eclipse的内存分析工具,mac版,不需要安装Eclipse,可以直接运行,用来分析内存泄漏等问题
mat介绍 博文链接:https://seanhe.iteye.com/blog/898277
堆dump分析工具Eclipse Memory Analyzer ,超强大的堆dump分析工具
用AndroidStudio内存泄漏分析,亲测可用,在项目中充分验证。
软件介绍: MemoryAnalyzer是一款JAVA版的内存分析工具,能帮助你解决内存泄露问题。使用前需要先安装JRE或JDK虚拟机。主程序:MemoryAnalyzer.exe
资源名称:Eclipse Memory...Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。 这个版本是支持jdk11的,上一个1.11的版本是jdk1.8的。收大家分就是因为下载比较难搞。
android 内存泄露 分析方法.非常难对应的问题。首先弄明白原理
android系统分析内存泄露测试android系统分析内存泄露测试android系统分析内存泄露测试
Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...
内存泄露分析工具Memory_Analyzer_Tool(MAT)介绍.docx