Articles of 内存

Android 2.2和2.3之间的内存使用情况

我正在开发一个包含许多图像的应用程序。 我注意到,我的应用程序的内存使用情况在Android 2.3比在Android 2.2更高 – 最终在加载位图时导致OutOfMemory错误。 在研究这个时,我在第一个activity的onResume中logging了Debug.getNativeHeapAllocatedSize()的结果。 在Android 2.2中,输出5MB。 在Android 2.3中,这输出17MB。 我创build了一个示例应用程序来尝试进一步缩小范围。 示例应用程序有两个活动:第一个有一个小图像和一个button来启动第二个活动; 第二个活动在ScrollView中有几个大的图像。 您可以在此处下载示例: http ://dl.dropbox.com/u/21709517/MemoryUsageExample.zip运行此示例时,Debug.getNativeHeapAllocatedSize()报告在2.2和2.3中启动第一个活动后分配的3MB。 启动第二项活动后,Android 2.2仍然报告3MB分配,而Android 2.3报告17MB分配。 运行“adb shell dumpsys meminfo test.example”显示相同types的结果。 为什么Android 2.2和2.3之间有如此巨大的差异? 更重要的是,我应该怎样做才能避免在Android 2.3上使用这么多的内存? —– —–更新 在查看Romain Guy发布的信息之后,我决定做更多的玩各种加载选项。 结果显示,强制图像加载为RGB_565确实减less了Android 2.3中的内存,但仍然使用了2.2以上。 在我的示例应用中,Android 2.3现在使用10MB,使用3MB的Android 2.2。 此外,我试图通过使用ARGB_8888强制32位。 在这种情况下,Android 2.3使用17MB,但Android 2.2继续使用3MB。 更新的示例可以在这里find: http : //dl.dropbox.com/u/21709517/MemoryUsageExample2.zip 造成这些差异的原因是什么? 是否有更多的需要做的内存使用更接近于Android 2.2? 另外,有没有办法强制通过XML布局创build的图像成为一种特定的格式? 这可以在应用程序范围内设置吗? 谢谢。 —– UPDATE 2 […]

调用procrank不适用于真实设备

根据谷歌的iovideo了解你的应用程序需要多less内存,你可以使用procrank并阅读它的USS值。 我试过了模拟器(不pipe我使用哪个版本 – 从2.3.x到4.1),它运作良好,但在实际设备上运行,它没有工作(testing星系s3与Android 4.0.4 )。 就好像命令不存在一样。 怎么会这样 ? 有没有其他办法来获得这个USS的价值?

内存泄漏的实际例子

我一直在努力识别内存泄漏。 我想我的项目循环进度视图中有几个内存泄漏。 我的猜测之一是我有内部类FadeRunnable内存泄漏。 但说实话,我不知道如何确定这是否是问题的根源。 那么,当我做通常的情况下,切换方向,我看到增加的内存使用情况如下所示。 如果我注释掉FadeRunnable类的用法,步骤会更小( 但仍然存在,所以我想这不是唯一的泄漏 ) 一旦我分析堆转储,我看到一些东西。 但实际上我不知道这些价值是什么意思。 我做的事情是 多次改变方向 打开堆转储并按“保留大小” 现在当我点击“CircularProgressView”时,我在右边看到了8行,我想这意味着有8个“CircularProgressView”实例泄漏,并且在内存中孤立地存在。 它是否正确? 如果是这样,我怎么能find转储信息( 我猜在下面的窗格中的某个地方 )保存/保存此对象的位置。 我很想有一个一步一步的解释如何找出是否和哪个对象泄漏一些内存。 所有怀疑视图的代码都可以在这个类中find。 https://github.com/momentummodules/CircularProgressView/blob/master/circularprogressview/src/main/java/momentum/circularprogressview/CircularProgressView.java 但也可以随时查看完整的项目,以获得更深入的洞察力,如果你想玩它。 提前致谢! UPDATE 上面的代码链接显示了mem-leaking内部类的固定代码。 下面的代码片段显示了永远不会这样使用的原始的泄漏代码 /** * Mem-leaking code, for fixed code see repository link * https://github.com/momentummodules/CircularProgressView/blob/master/circularprogressview/src/main/java/momentum/circularprogressview/CircularProgressView.java */ public class CircularProgressView extends View { … private Thread fadeThread = null; … … class FadeRunnable […]

添加一个简单的ScrollView到图库导致内存泄漏

我遇到了我只能用ScrollView元素在使用Gallery组件时分类为内存泄漏的情况。 一个简短的背景。 我有一个现有的应用程序,是一个照片幻灯片应用程序。 它使用图库组件,但适配器中的每个元素都以全屏显示。 (完整的来源可在此链接 ) 适配器视图元素由一个ImageView和两个用于标题和描述的TextView组成。 由于照片的分辨率相当高,该应用程序使用了相当多的内存,但是图库一般都能够很好地回收它们。 但是,当我现在正在实现一个描述TextView的ScrollView时,我几乎立即遇到了内存问题 。 这是我做的唯一的改变 <ScrollView android:id="@+id/description_scroller" android:layout_width="fill_parent" android:layout_height="wrap_content" android:scrollbars="vertical" android:fillViewport="true"> <TextView android:id="@+id/slideshow_description" android:textSize="@dimen/description_font_size" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/white" android:layout_below="@id/slideshow_title" android:singleLine="false" android:maxLines="4"/> </ScrollView> 我做了一个堆转储,可以清楚地看到,这是内存问题的根源滚动查看。 以下是堆转储分析的两个屏幕截图。 请注意,ScrollView保留了mParent的参考,其中包括我使用的大照片 PS同样的问题,如果我使用TextView的滚动(android:scrollbars =“vertical”和.setMovementMethod(new ScrollingMovementMethod()); PSS尝试closures持久性绘图caching,但没有不同的dreaandroid:persistentDrawingCache =“none”

如何纠正这个错误:java.lang.OutOfMemoryError

这是我的代码: public void onPictureTaken(byte[] data, Camera camera) { Bitmap foto = BitmapFactory.decodeByteArray(data, 0, data.length); wid = foto.getWidth(); hgt = foto.getHeight(); Bitmap newImage = Bitmap.createBitmap(wid, hgt, Bitmap.Config.ARGB_4444); Canvas canvas = new Canvas(newImage); canvas.drawBitmap(foto, 0f, 0f, null); if (newImage.getWidth() > newImage.getHeight()) { Matrix matrix = new Matrix(); matrix.postRotate(90); newImage.createBitmap(newImage, 0, 0, wid, hgt, matrix, true); } } […]

SoftReference是否在Bitmap对象上调用.recycle()

如果我使用SoftReference将位图存储在HashMap中,SoftReference会在Bitmap上调用.recycle() 如果不是,那么在给定情况下(当位图在HashMap中)时,怎样才能从内存中正确地清除位图呢?

gson.fromJson()中的内存不足exception

我使用下面的代码将Jsonstring(strWebserviceResult)转换为我的对象: EntMyClass entMyClass = gson.fromJson(strWebserviceResult,EntMyClass.class); 当strWebserviceResult很大(大约2.5 MB)时,我在Android手机设备上的这一行上得到了内存不足的exception,而不是在具有较大内存的平板电脑上。 我该如何解决这个问题。 有人有什么build议吗? 05-26 15:52:49.607: E/dalvikvm-heap(2078): Out of memory on a 9200-byte allocation. 05-26 15:52:49.618: E/dalvikvm(2078): Out of memory: Heap Size=31879KB, Allocated=27693KB, Bitmap Size=936KB, Limit=32768KB 05-26 15:52:49.618: E/dalvikvm(2078): Extra info: Footprint=31879KB, Allowed Footprint=31879KB, Trimmed=7400KB 05-26 15:52:49.618: E/AndroidRuntime(2078): FATAL EXCEPTION: Thread-19 05-26 15:52:49.618: E/AndroidRuntime(2078): java.lang.OutOfMemoryError: (Heap Size=31879KB, Allocated=27693KB, Bitmap Size=936KB) […]

如何避免android中的createBitmap()崩溃

我在多个地方使用createBitmap() 。 有时候这个api会抛出OutOfMemoryError()exception。 如何避免这种exception? 我使用如下, createBitamp(width, height, Config.ARGB_8888); width = width屏幕的width = width height = height屏幕的height = height 任何帮助,将不胜感激。

在iPhone和Android上进行内存alignment

正如我从我的testing发现iPhone的malloc有16字节alignment。 但是我不确定这是保证还是只是巧合。 所以问题是:在iOS和Android(NDK)上使用malloc()时,保证的内存alignment是什么?

增加分配给应用程序的内存

我尝试显示相机拍摄的图像并将其显示在应用程序中。 当我采取低分辨率的图像(比如说100kB大小)时,切换到位图显示时没有问题,当我以高分辨率(1.5MB)进行切换时,应用程序崩溃 Error java.lang.OutOfMemoryError. 它正好在我的智能手机上(三星Galaxy SII,SIII Galaxy)在所有货架上。 现在,我通过降低照片的质量和尺寸来手动解决问题,但鉴于摄像机的分辨率日益提高,这个问题可能会更频繁地出现。 是否没有一个永久性的解决scheme来增加分配给我的应用程序的Android的内存没有手动干预的设备和代码? 图像以位图格式存储 //image creation Uri domuri1 ContentValues cv = new ContentValues(); cv.remove("101"); domuri1 = getContentResolver().insert(Media.EXTERNAL_CONTENT _URI, cv); File domthumb1 = new File(domuri1.toString(), fileName1); //increment photo apparate Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, domuri1); startActivityForResult(intent, 100); //images save ContentResolver cr = getContentResolver(); bitmap1 = MediaStore.Images.Media.getBitmap(cr, domuri1 ); imageView.setImageBitmap(bitmap1);