引起:java.lang.OutOfMemoryError:位图大小超过虚拟机预算

在我的应用程序,当我尝试启动它强制closures和错误指向行“setContentView(R.layout.Menu);” 的布局。 在XML文件中,它显示我的布局中的“OutOfMemoryError”图像视图。 我真的很困惑。 请引导我进一步移动。

编辑:

我的应用程序使用数据库,并在第一次parsing一些XML数据并插入到Sqlite数据库。 我的Outofmemory问题只发生在第一次。 第二次,它工作正常。 我试过System.gc()。 那有没有什么可能

这是我的日志:

E/dalvikvm-heap(2712): 105376-byte external allocation too large for this process. VM won't let us allocate 105376 bytes FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Test/com.Test.Menu}: android.view.InflateException: Binary XML file line #13: Error inflating class <unknown> at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) at android.app.ActivityThread.access$1500(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3683) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class <unknown> at android.view.LayoutInflater.createView(LayoutInflater.java:518) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568) at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) at android.view.LayoutInflater.rInflate(LayoutInflater.java:626) at android.view.LayoutInflater.inflate(LayoutInflater.java:408) at android.view.LayoutInflater.inflate(LayoutInflater.java:320) at android.view.LayoutInflater.inflate(LayoutInflater.java:276) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207) at android.app.Activity.setContentView(Activity.java:1657) at com.Test.Menu.onCreate(Menu.java:32) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) ... 11 more Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.constructNative(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:415) at android.view.LayoutInflater.createView(LayoutInflater.java:505) ... 23 more Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) at android.content.res.Resources.loadDrawable(Resources.java:1709) at android.content.res.TypedArray.getDrawable(TypedArray.java:601) at android.widget.ImageView.<init>(ImageView.java:118) at android.widget.ImageView.<init>(ImageView.java:108) 

这是我的XML代码:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:id="@+id/RL_Title" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="8" android:onClick="onTitleClick" > <ImageView android:id="@+id/Img_Title_bg" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="center" android:src="@drawable/title_bg" /> <Button android:id="@+id/Btn_Title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="5dp" android:background="@drawable/title_al" android:drawableRight="@drawable/pro" android:gravity="center" android:onClick="onTitleClick" /> </RelativeLayout> <RelativeLayout android:id="@+id/RL_MainMenu" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:onClick="onDoNothing"> <ImageView android:id="@+id/ImageView01" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="4" android:src="@drawable/main_bg" android:scaleType="centerCrop"/> <ImageView android:id="@+id/Img_logo" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="4" android:scaleType="center" android:src="@drawable/logo_al" /> <LinearLayout android:id="@+id/LI_Menu" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/RL_ExtraOption" android:layout_alignTop="@+id/Img_logo" android:layout_margin="2dp" android:orientation="vertical" > <ImageButton android:id="@+id/Img_Buyer" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="1dp" android:layout_weight="1" android:background="@drawable/bt_blink" android:onClick="Nextclick" android:scaleType="fitCenter" android:soundEffectsEnabled="true" android:src="@drawable/buyer_icon" /> <ImageButton android:id="@+id/Img_Seller" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="1dp" android:layout_weight="1" android:background="@drawable/bt_blink" android:onClick="Nextclick" android:scaleType="fitCenter" android:src="@drawable/seller_icon" /> <ImageButton android:id="@+id/Img_Lender" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="1dp" android:layout_weight="1" android:background="@drawable/bt_blink" android:onClick="Nextclick" android:scaleType="fitCenter" android:src="@drawable/lender_icon" /> <ImageButton android:id="@+id/Img_myTitleRep" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="1dp" android:layout_weight="1" android:background="@drawable/bt_blink" android:onClick="Nextclick" android:scaleType="fitCenter" android:src="@drawable/my_title_rep_icon_al" /> <ImageButton android:id="@+id/Img_Setup" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="1dp" android:layout_weight="1" android:background="@drawable/bt_blink" android:onClick="Nextclick" android:scaleType="fitCenter" android:src="@drawable/setup_icon" /> </LinearLayout> <RelativeLayout android:id="@+id/RL_ExtraOption" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/main_bottom_bg" > <TextView android:id="@+id/txt_RepName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:textColor="@color/white" android:textSize="@dimen/font_size" /> <TableRow android:id="@+id/TR_ContactRep" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:gravity="center" > <Button android:id="@+id/Btn_ContactRep" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="3dp" android:background="@drawable/contact_rep_blink" android:onClick="ContactRep_Click" /> <Button android:id="@+id/Btn_MoreOption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5dp" android:background="@drawable/main_more_blink" android:onClick="onMoreClick" /> </TableRow> </RelativeLayout> <LinearLayout android:id="@+id/ln_Mainmore" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/dialog_bg" android:layout_alignParentBottom="true" android:visibility="gone"> <LinearLayout android:id="@+id/LinearLayout02" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="3" android:orientation="vertical" > </LinearLayout> <TableLayout android:id="@+id/TableLayout01" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" > <TableRow android:id="@+id/TableRow04" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:layout_marginTop="20dp" android:gravity="center" > <Button android:id="@+id/Btn_Rate" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/property_blue_blink" android:onClick="onRate" android:singleLine="true" android:text="Rate/Testimonial" android:textColor="@color/white" android:textSize="@dimen/font_size" android:textStyle="bold" /> </TableRow> <TableRow android:id="@+id/TableRow01" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:gravity="center" > <Button android:id="@+id/btn_SubFeature" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/property_blue_blink" android:onClick="onSubFeature" android:singleLine="true" android:text="Submit A Feature" android:textColor="@color/white" android:textSize="@dimen/font_size" android:textStyle="bold" /> </TableRow> <TableRow android:id="@+id/TableRow03" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:gravity="center" > <Button android:id="@+id/Btn_ReferFrnd" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/property_blue_blink" android:onClick="onReferAFrnd" android:text="Refer A Friend" android:textColor="@color/white" android:textSize="@dimen/font_size" android:textStyle="bold" /> </TableRow> <TableRow android:id="@+id/TableRow02" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:gravity="center" > <Button android:id="@+id/Btn_cancel" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/property_cancel_blink" android:onClick="onClose" android:text="Cancel" android:textColor="@color/black" android:textSize="@dimen/font_size" android:textStyle="bold" /> </TableRow> </TableLayout> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="3" android:orientation="vertical" > </LinearLayout> </LinearLayout> </RelativeLayout> 

Solutions Collecting From Web of "引起:java.lang.OutOfMemoryError:位图大小超过虚拟机预算"

我猜这个问题不在你的布局中; 问题是在你的代码中的其他地方。 而且你可能在某个地方泄漏了环境

其他可能的原因是,在parsingXML时,您必须创build庞大的多个对象(正如您在parsingXML时第一次提到的那样)。 虽然Java有自动垃圾收集的方法,但是仍然不能完全依靠它。 当你不需要它们的时候取消你的集合实例或清除你的对象内容是一个很好的习惯

但是,我仍然准备了一些重要的点,在处理Android上的位图时应该记住这些点。

1)您可以在每个位图上调用回收并将其设置为空。 ( bitmap.recycle()将释放此位图使用的所有内存,但不会使位图对象无效)。

2)当活动被破坏时,您还可以解除与布局关联的drawables 。 尝试下面给出的代码,也看看这个链接的链接 。

  private void unbindDrawables(View view) { if (view.getBackground() != null) { view.getBackground().setCallback(null); } if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { unbindDrawables(((ViewGroup) view).getChildAt(i)); } ((ViewGroup) view).removeAllViews(); } } // Call this method from onDestroy() void onDestroy() { super.onDestroy(); unbindDrawables(findViewById(R.id.RootView)); System.gc(); } 

3)你可以将你的hashmaps转换成WeakHashmaps ,这样当系统内存不足时它的内存就会被释放。

4)你可以缩放/调整你所有的位图。 要缩放位图,您可以尝试如下所示:

  BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; Bitmap preview_bitmap=BitmapFactory.decodeStream(is, null, options); 

这inSampleSize选项减less内存消耗。

这是一个完整的方法。 首先它读取图像大小而不解码内容本身。 然后find最好的inSampleSize值; 它应该是2的幂。最后,图像被解码。

 // Decodes image and scales it to reduce memory consumption private Bitmap decodeFile(File f){ try { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(f),null,o); // The new size we want to scale to final int REQUIRED_SIZE=70; // Find the correct scale value. It should be the power of 2. int scale=1; while(o.outWidth/scale/2 >= REQUIRED_SIZE && o.outHeight/scale/2 >= REQUIRED_SIZE) scale*=2; // Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize=scale; return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); } catch (FileNotFoundException e) { } return null; } 

看看这个链接。 。

5)当整个系统内存不足时,可以在一个活动中覆盖onLowMemory()方法。 你可以在那里发布一些资源。

6)你可以使你的对象SoftReferenceWeakreference ,以便他们在低内存条件释放。

我观察到的一个非常常见的内存泄漏是由于实现了内部类并在Activity实现了Handler 。 这更详细地链接了相同的谈话 。

我希望这有助于消除你的问题。

在旧版设备上使用Android ImageView和较大的图像时(即使文件大小只有几Kbs),这是一个典型的问题。 用于解码图像的本地graphics库skia用于根据图像的尺寸分配本地内存,因此文件大小不会直接影响此图像。

即使您在XML布局定义中省略了src属性来自己在onCreate()方法中加载图像,也会触发相同的错误。 解决此问题的唯一方法是使用BitmapFactory.decodeStreaminSampleSize在解码过程中直接执行下采样(例如, 在将图像加载到Bitmap对象时,出现内存不足的问题 )。 这本身就提出了如何确定这个比例因子的问题。

我在处理大图像时发现的最佳解决scheme是用WebViewreplaceImageView ,并加载一些最小的HTML,如下所示:

 webView.loadUrl("file:///android_res/raw/background.html"); 

raw/background.html的内容可能是这样的:

 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> <style type="text/css"> body { margin: 0; } img { width: 100%; height: auto; display: block; } </style> </head> <body> <img src="file:///android_res/drawable/background.png" /> </body> 

WebView中使用的WebKit引擎以更高效的方式执行图像加载,因此这些内存分配错误应该消失。

你甚至可以使用不同的肖像和风景的图像,把它们放在drawable-portdrawable-land 。 但是,您必须在onDestroy()方法的WebView实例上调用clearCache(false) ,否则将始终使用在第一次加载时caching的图像(禁用WebView实例上的caching不起作用)。

许多设备的可用内存都非常有限且受限制。 许多较旧的设备为您的应用程序分配16MB的内存,而一些更新的设备可能分配24MB甚至32MB(我见过一个只有14MB的设备)。

每当你把这么多的图像加载到内存中,这个空间就会很快填满,导致OutOfMemoryError被抛出。 为了克服这个问题,你应该(如以前的答案所述)将图像缩小为缩略图,并且只将缩略图保留在设备内存中(减less内存占用)并将图像保存到SDCARD。

您可以从Eclipse中的DDMS布局中看到您的程序使用了多less内存。 我相信你也可以覆盖Application类来监听“Low Memory”警告函数。

当您通过BitmapFactory读取位图时,将BitmapFactory.Option inScaled参数设置为2或4(或适用于您的任何内容)以创build更小,内存更less的图像。

一般来说,只有一个解决scheme:使用较小的图像。 如果没有代码,很难说什么是错的。 您可以尝试降低图像大小。

除了这里写的是什么人之外,​​我build议看看这个google的video,这个video指向一些常见的内存问题,以及如何find你的内存问题的原因:

内存pipe理Android应用程序

我之前也有同样的问题,我正在S4 android 4.3上进行debugging。 解决scheme是: 将图像从mdpi文件夹复制到hdpi文件夹(所以他们现在都在这两个文件夹)

我知道怪怪的! 但是这解决了我的问题。

在这个问题上花了很多时间后,我find了解决scheme! 所有你需要做的是要求更多的记忆。 把这个代码放在你的Android清单下:

 <application>: 

放:

 android:largeHeap="true" 

为我工作很好! 请注意,此解决scheme仅适用于API 11及更高版本。

更多信息在这里。

它接缝像你的图像是大尺寸,所以你可以解码你的形象,并使用android:largeHeap =“true”。 应用程序标签的内部清单

你可能已经通过了上述所有的解决scheme,但仍然尝试。 在find解决scheme之前,我迷失了方向。 这可能会为你的情况夜间工作(对不起,在这种情况下)。

myIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TASK); myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

把这些放在你打电话给你的活动之前