Dalvik 虚拟机支持垃圾收集,但是这不意味着你可以不用关心内存管理。你应该格外注意移动设备的内存使用,手机和平板 的内存空间是受到限制的。
在这篇文章里面,我们来看看Android SDK里面的一些内存剖析工具(profiling tools)是 如何帮助我们修整应用程序的内存使用。
一、 内存泄露
一些内存使用问题是很明显的,例如,如果在每次用户 触摸屏幕的时候应用程序有内存泄露,将会有可能触发OutOfMemoryError,最终程序崩溃。
另外一些问题却很微妙,也 许只是降低应用程序和整个系统的性能(当高频率和长时间地运行垃圾收集器的时候)。
二、 内存工具
Android SDK 提供了2个主要的剖析应用程序内存使用情况的工具:Allocation Tracker 和 heap dumps
1)Allocation Tracker 是很有用的,特别是当你想得到程序在一定的时间里内存的分配情况的一种感性认识的时候。但是它不能给你任何关于程序heap 总体情况的任何 信息。关于Allocation Tracker的更多信息,请看文章Tracking Memory Allocations
2)heap dumps ,它是更强大的内存分析工具,一个heap dump就是一个程序heap的快照,它保存为一种叫做HPROF的二进制格式。Dalvik用的也 是类似的格式,但是不完全一样,这里是Java 的HPROF工具 。有很多方法去生成一个运行时应用程序的heap dump,其中一种就 是使用在DDMS里边的Dump HPROF file按钮,如果想产生更精确的dump数据,可以在程序中使用 android.os.Debug.dumpHprofData() 方法。
分析heap dump,你可以使用一些标准的工具比如 jhat 或者Eclipse MAT( Memory Analyzer Tool) 。不过,首先需要把.hprof文件从Dalvik格式转换成J2SE HPROF格式,你可以使用Android SDK提供的 hprof-conv工具。例如:
hprof-conv dump.hprof converted-dump.hprof
三、 内存调试
Dalvik 运行时里,程序员不能显式地分配和释放内存,所以这里的内存泄露跟C和C++里面的不同。在你的代码里,内存 泄露就是你保留了一个并不再需要的类对象的引用,有时候仅仅一个引用就会阻碍gc对一大堆对象的回收。
我们来过一 个实际的例子,Android SDK里面提供的范例程序Honeycomb Gallery sample app 。它是一个photo gallery程序,用来演示一 些新的Honeycomb API的使用。(下载和编译这些代码,请看这些 命令 )我们会有意地加入一个内存泄露在程序里边,然后来 演示如何调试它。
想象一下我们想修改程序让它从网络下载图片,为了让它更具备灵活性,我们可以考虑实现一个缓存 ,保存最近查看过的图片,我们可以对ContentFragment.java做一些小的修改来达到这个目的。在class顶部,我们增加一个新 的静态变量:
private static HashMap<String,Bitmap> sBitmapCache = new HashMap<String,Bitmap> ();
这里是我们保存缓存的地方,现在可以修改updateContentAndRecycleBitmap()方法,让它在下载之前先查看是否数 据已经存在,如果不存在就去下载,然后添加数据到缓存。
void updateContentAndRecycleBitmap (int category, int position) { if (mCurrentActionMode != null) { mCurrentActionMode.finish(); } // Get the bitmap that needs to be drawn and update the ImageView. // Check if the Bitmap is already in the cache String bitmapId = "" + category + "." + position; mBitmap = sBitmapCache.get(bitmapId); if (mBitmap == null) { // It's not in the cache, so load the Bitmap and add it to the cache. // DANGER! We add items to this cache without ever removing any. mBitmap = Directory.getCategory(category).getEntry(position).getBitmap(getResources()); sBitmapCache.put(bitmapId, mBitmap); } ((ImageView) getView().findViewById(R.id.image)).setImageBitmap(mBitmap); }
在这里故意引入了一个内存泄露的问题:我们把图片加入了缓存但是从来没有移除他们,在真实的应用里,我们可以 会用某种方法来限制缓存的大小。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 工具
, 缓存
, dalvik
, 程序
, 应用程序
, hprof
, 内存泄露内存android
, 图片缓存android
, 缓存android
, 一个
, android缓存实现
, android数据缓存
Android图片缓存
android内存检测工具、android内存优化、android 内存泄露分析、android 性能分析工具、android内存分析,以便于您获取更多的相关知识。