Articles of 内存不足

如何修复位图大小的错误超过虚拟机预算

我正在工作一个应用程序图像上传到SD卡我缩放SD卡保存到数据库有时出现一个错误位图大小超过VM预算 ouput : 01-11 15:39:51.809: ERROR/AndroidRuntime(6214): Uncaught handler: thread main exiting due to uncaught exception 01-11 15:39:51.979: ERROR/AndroidRuntime(6214): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 01-11 15:39:51.979: ERROR/AndroidRuntime(6214): at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method) 01-11 15:39:51.979: ERROR/AndroidRuntime(6214): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:384) 01-11 15:39:51.979: ERROR/AndroidRuntime(6214): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:397) 01-11 15:39:51.979: ERROR/AndroidRuntime(6214): at com.fitzgeraldsoftware.shout.presentationLayer.Shout.onActivityResult(Shout.java:1653) 01-11 15:39:51.979: ERROR/AndroidRuntime(6214): at android.app.Activity.dispatchActivityResult(Activity.java:3624) 01-11 15:39:51.979: ERROR/AndroidRuntime(6214): at android.app.ActivityThread.deliverResults(ActivityThread.java:3220) […]

旋转位图会导致outOfMemoryException

我正在这样旋转一个位图,每按一下鼠标点击图像旋转90度 Matrix matrix = new Matrix(); matrix.postRotate(90); rotated = Bitmap.createBitmap(rotated, 0, 0, rotated.getWidth(), rotated.getHeight(), matrix, true); iv.setImageBitmap(rotated); 我尝试了很多图片,但是现在却引发了一个OutOfMemoryError。 有没有办法来防止这一点? 当然,我可以打电话回收,但是然后我失去了位图,必须从imageview中再次得到它。 我不认为这会有所作为。

Android在图像捕捉方面内存不足

我有一个活动,拍摄照片(完全可能的解决scheme,非常大),应用程序,然后有机会分析它们。 一次只处理一张照片。 问题是我跑了4 – 5张照片后,“内存不足”。 我懂了 dalvikvm-heap 5070745字节分配内存不足 (字节大小变化)后面 Camera-JNI无法为JPEG数据分配字节数组 我的应用程序不会崩溃,但在我看来,相机只是无法从这一点上传递图像。 我注意在我的应用程序的内存使用情况,但在这里似乎有一个内存泄漏的地方外面,我问我怎么能应付这个。 现有的任何解决scheme?

outofmemoryerror当做位图

我正在制作相机预览和PNG的相机应用程序。 我想保存在onPictureTakencallback的图像 我的来源是在下面 public void onPictureTaken(byte[] data, Camera camera) { //preview from camera Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); // overlay image Bitmap overlayBmp = overlay.getDrawingCache(); //blank beatmap Bitmap blankBitmap = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888); //make canvas Canvas canvas = new Canvas(blankBitmap); //composite image canvas.drawBitmap(bitmap, null,new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), null); canvas.drawBitmap(overlayBmp, null,new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), […]

Android Outofmemory可绘制

这是我的drawable在我的viewpager数组,当我运行它,我导致内存不足的错误,是否有任何方法来减less图像大小或等? 我做了很多search,但我不能使用它们..请帮助… GalImages = new int[] { R.drawable.tutorials_01_android_en,R.drawable.tutorials_02_android_en,R.drawable.tutorials_03_android_en,R.drawable.tutorials_04};break @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(context); final int temp = position; imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); imageView.setImageResource(GalImages[position]); ((ViewPager) container).addView(imageView, 0); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) {} }); return imageView; }

OutOfMemory错误只在Android 6.0.1设备上

看来我的项目有这个奇怪的问题。 这一切工作正常,但由于我更新我的S6边缘到Android 6.0.1应用程序似乎崩溃后 ,第二次启动OutOfMemory错误。 该应用程序包含目录中的2000多个图像,我正在使用一个计时器来增加一个计数器,并将它们显示在一个imageView上。 当onFinish()/ onPause()/ onDestroy()被调用时,我正在销毁/取消所有的对象,如计时器,计数器和imageView设置为null。 这是我如何获取/打印图像到imageView int resID = getResources().getIdentifier("animation"+i , "drawable", getPackageName()); Drawable animationFrame = ContextCompat.getDrawable(this, resID); animationView.setImageDrawable(animationFrame); i++; 在初次启动时,一切都运行良好(即使我使用生成的APK安装应用程序)。 但是,当我从最小化的应用程序中删除应用程序,应用程序在2-3秒后崩溃。 我检查了分配的内存,第一次运行是正常的(高达12MB),而第二次分配的内存是255MB。 onDestroy()方法这包括所有我的variables初始化。 另外,不要如果事情,但我的variables被初始化为私人或没有访问variables @Override protected void onDestroy() { super.onDestroy(); pauseAnimation(); animationView.setImageDrawable(null); animationView = null; justAnimation = null; buttonSign = null; i = 0; media.stop(); media = null; deathRateEU = 0; […]

如何找出有多less免费的堆大小可用于Android 2.位图。

我们的应用程序使用了很多位图。 它在G1,XOOM上工作正常。 但在HTC Desire上有一个OutOfMemory错误。 在代码中,我们使用try / catch(OutOfMemoryError e),所有设备(Desire除外)都抛出exception,但是HTC只是杀死了没有OOMexception的应用程序。 我们将位图的内存限制在12Mb,似乎这个解决scheme解决了这个问题,但客户在HTC Desire HD上仍然有问题。 即使有12 Mb的限制,也有OOM。 这里是日志: 06-07 12:03:43.978 E/dalvikvm-heap( 29616):1140128-byte external allocation too large for this process. 06-07 12:03:43.978 E/dalvikvm( 29616):Out of memory: Heap Size=12311KB, Allocated=9420KB, Bitmap Size=12139KB, Limit=21884KB 06-07 12:03:43.978 E/dalvikvm( 29616):Trim info: Footprint=15751KB, Allowed Footprint=15751KB, Trimmed=3440KB 06-07 12:03:43.978 E/GraphicsJNI( 29616):VM won't let us allocate 1140128 […]

寻找Android的“杀手”内存caching机制

背景 Android有一个非常有限的最大堆大小,每个设备有不同的最大堆。 某些应用程序需要将内容(通常是图像)caching在内存中,而不仅仅是内部/外部存储。 当然,关于处理位图和使用尽可能less的内存有很多好的提示 ,但是caching也是需要的。 问题 我已经阅读了许多可能的caching解决scheme,但都没有提供一种caching,这将是一个杀手级caching解决scheme。 我想要的是具有下一个特性的caching机制: 无限制地使用堆,而不用担心内存不足。 应用程序需要内存,没有足够的可用内存? 所以释放一些(未被引用的)项目(和它们的键)。 线程安全性/并发性。 提供基于LRU的caching,以便最近使用的项目留下的机会更大。 尽可能保持活力(但不会导致任何崩溃)。 然而,不幸的是,在Android上,与Java相比,软/弱引用GC-ed非常快速。 能够处理隐藏其实际大小的对象。 在Android上,在API 10及以下版本中,位图并没有使用堆内存,而是被认为是这样,所以虚拟机无法知道何时释放它们,因为它认为使用相同数量的内存作为单个引用(4字节左右)。 这就是为什么一些解决scheme提供人为地告诉每个项目的大小,以及当它是时候删除它应该做什么。 一些很好的解决scheme LruCache – 来自API 12的一个类(你可以很容易地复制它的代码)。 优点:#2(?),#3,#5。 缺点:#1,#4,加上你需要复制它的源代码,因为它是在API 12上呈现的。 一个哈希映射,其值为软/弱参考 ,如本文第50页所示,摘自本演讲 。 优点:#1(但不删除键),#2(需要使用ConcurrentHashMap ) 缺点:#3,#4,#5 MapMaker (可从guava库中获得 ),就像以前的解决scheme的高级版本。 优点:#1,#2 缺点:#3,#4,#5 通过番石榴库caching解决scheme 。 优点和缺点是根据您的select。 不知道哪种configuration最适合需求,如果它在Android上正常工作。 可悲的是,我甚至无法成功编译Android库。 Android查询 – 不知道它是如何工作的。 看起来很容易使用,但不知道它的优点和缺点。 题 有人知道杀手caching机制吗? 我对function#5不在乎,因为它是相当先进的,将来不会太需要,因为越来越多的人拥有更新的Android版本。

在android中膨胀简单的xml布局时,内存不足错误

我有一个出口,如果内存错误报告的一些用户在谷歌播放,我似乎无法再现,无论我多努力尝试。 错误显示在我的java文件的行,我尝试设置我的文件的布局。 这里是logcat的完整转储: {java.lang.RuntimeException:无法启动活动ComponentInfo {org.djodjo.android.sport.GrassrootsDragRacing / org.djodjo.android.sport.GrassrootsDragRacing.LogSheet}:android.view.InflateException:二进制XML文件行#2:错误膨胀类 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 在android.app.ActivityThread.access $ 600(ActivityThread.java:128) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1161) 在android.os.Handler.dispatchMessage(Handler.java:99) 在android.os.Looper.loop(Looper.java:137) 在android.app.ActivityThread.main(ActivityThread.java:4514) 在java.lang.reflect.Method.invokeNative(本地方法) 在java.lang.reflect.Method.invoke(Method.java:511) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:980) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 在dalvik.system.NativeStart.main(本地方法) 引起:android.view.InflateException:二进制XML文件行#2:错误膨胀类 在android.view.LayoutInflater.createView(LayoutInflater.java:606) 在com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 在android.view.LayoutInflater.onCreateView(LayoutInflater.java:653) 在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678) 在android.view.LayoutInflater.inflate(LayoutInflater.java:466) 在android.view.LayoutInflater.inflate(LayoutInflater.java:396) 在android.view.LayoutInflater.inflate(LayoutInflater.java:352) 在com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:274) 在android.app.Activity.setContentView(Activity.java:1835) 在org.djodjo.android.sport.GrassrootsDragRacing.LogSheet.onCreate(LogSheet.java:20) 在android.app.Activity.performCreate(Activity.java:4470) 在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053) 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934) … 11更多 引起:java.lang.reflect.InvocationTargetException 在java.lang.reflect.Constructor.constructNative(本地方法) 在java.lang.reflect.Constructor.newInstance(Constructor.java:417) 在android.view.LayoutInflater.createView(LayoutInflater.java:586) … 23更多 引起:java.lang.OutOfMemoryError 在android.graphics.Bitmap.nativeCreate(本地方法) 在android.graphics.Bitmap.createBitmap(Bitmap.java:605) 在android.graphics.Bitmap.createBitmap(Bitmap.java:551) 在android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437) 在android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:618) 在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:593) 在android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445) […]

当内存不足时,Android不会从堆栈中查看活动

我们一直在开发一个具有下拉式仪表板的应用程序,允许用户在整个应用程序中导航。 导航不是很标准,因为这个菜单几乎可以从任何活动访问。 玩了一段时间后,开始使用菜单的活动,堆栈开始增长和成长。 所有这些活动都包含了几个图像浏览的listview,每个大概需要3mb。 如果用户玩的足够多,并且在堆栈上创build超过25个活动,则会发生以下情况: 内存不足错误被抛出(堆增加,直到没有更多的堆)。 显示一个对话框,由于exception(不幸的是,%activity%已经停止。) outofmemerror被扔的活动结束了。 堆栈中的所有活动都已完成,但历史logging保留,所以可以进行备份,每个活动都由操作系统自动重新创build。 我期待系统自动杀死堆栈中最古老的活动BEFRORE OutOfMemoryError被抛出… 为了确保操作系统不会杀死旧的操作,我创build了一个每次分配1mb的testing应用程序。 猜猜是什么:行为是一样的,并引发了exception的错误: 问题是:我们如何告诉Android操作系统,如果需要,可以释放活动和资源,所以我们不会得到“不幸的是,你的活动已经停止”。 对话? 概念validation 包com.gaspar.memorytest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MemoryTestActivity extends Activity { /** Called when the activity is first created. */ private byte[] mData; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main1); […]