【问题标题】:java.lang.OutOfMemoryError - How do I fix this? [duplicate]java.lang.OutOfMemoryError - 我该如何解决这个问题? [复制]
【发布时间】:2017-03-30 07:11:21
【问题描述】:

我正在尝试在一项活动中实现分页,但内存一直不足。该应用程序一直运行到第 4 页,但是当它到达第 5 页时它崩溃了。我已经尝试增加 JVM 堆大小,但应用程序仍然会在内存不足的地方崩溃。

这是我的主文件:

public class S1Intro extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_s1);

    MyPagerAdapter adapter = new MyPagerAdapter();
    ViewPager myPager = (ViewPager) findViewById(R.id.intro_panels);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(0);
}

Intent intent = new Intent(S1Intro.this,S2CharacterIntro.class);

public void nextScreen(View view){
    startActivity(intent);
}

这是 PageAdapter 类:

public class MyPagerAdapter extends PagerAdapter {

public int getCount() {
    return 5;
}

public Object instantiateItem(View collection, int position) {

    LayoutInflater inflater = (LayoutInflater) collection.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    int resId = 0;
    switch (position) {
        case 0:
            resId = R.layout.s1a;
            break;
        case 1:
            resId = R.layout.s1b;
            break;
        case 2:
            resId = R.layout.s1c;
            break;
        case 3:
            resId = R.layout.s1d;
            break;
        case 4:
            resId = R.layout.s1e;
            break;
    }

    View view = inflater.inflate(resId, null);

    ((ViewPager) collection).addView(view, 0);

    return view;
}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
    ((ViewPager) arg0).removeView((View) arg2);

}


@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == ((View) arg1);

}

@Override
public Parcelable saveState() {
    return null;
}

}

这是第一页的 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/a"/>
</LinearLayout>

所有其他页面都是这样的,带有不同的drawable。除了第 5 页,它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_screen2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.miniproject32.writeup.S1Intro">
<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/e"/>
<Button
    style="@style/buttonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/button_s1"
    android:text="@string/start"
    android:onClick="nextScreen"/>
</RelativeLayout>

这是日志猫:

03-30 12:17:31.866 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.866 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.896 498-498/? I/art: Alloc sticky concurrent mark sweep GC freed 1003(75KB) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/89MB, paused 885us total 33.721ms
03-30 12:17:31.896 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.906 1139-1139/? D/ResourcesManager: For user 0 new overlays fetched Null
03-30 12:17:31.916 498-498/? I/art: Alloc partial concurrent mark sweep GC freed 71(2848B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 823us total 17.333ms
03-30 12:17:31.916 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.946 498-498/? I/art: Alloc concurrent mark sweep GC freed 115(20KB) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 885us total 24.108ms
03-30 12:17:31.946 498-498/? I/art: Forcing collection of SoftReferences for 36MB allocation
03-30 12:17:31.946 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.946 612-836/? D/ResourcesManager: For user 0 new overlays fetched Null
03-30 12:17:31.966 498-504/? W/art: Suspending all threads took: 19.805ms
03-30 12:17:31.966 498-498/? I/art: Alloc concurrent mark sweep GC freed 11(344B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 1.434ms total 23.834ms
03-30 12:17:31.966 498-498/? W/art: Throwing OutOfMemoryError "Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM"
03-30 12:17:31.976 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.976 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.976 612-836/? D/ResourcesManager: For user 0 new overlays fetched Null
03-30 12:17:31.986 498-498/? I/art: Alloc sticky concurrent mark sweep GC freed 3(1264B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 915us total 10.620ms
03-30 12:17:31.986 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.986 612-612/? I/IntowowAdapter: not wifi, stop request intowow ad
03-30 12:17:31.996 498-498/? I/art: Alloc partial concurrent mark sweep GC freed 10(320B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 885us total 13.458ms
03-30 12:17:31.996 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:32.026 498-498/? I/art: Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 1.068ms total 25.024ms
03-30 12:17:32.026 498-498/? I/art: Forcing collection of SoftReferences for 36MB allocation
03-30 12:17:32.026 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:32.056 498-498/? I/art: Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 885us total 24.536ms
03-30 12:17:32.056 498-498/? W/art: Throwing OutOfMemoryError "Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM"
03-30 12:17:32.056 498-498/? D/skia: --- allocation failed for scaled bitmap
03-30 12:17:32.056 612-612/? I/KBattery: [PLACE] at com.ijinshan.kbatterydoctor.cloud.NewRemoteCloudConfigHelper.b(NewRemoteCloudConfigHelper.java:600)
                                     [NewRemoteCloudConfigHelper]isPackedNotification lastAid = 9
03-30 12:17:32.056 498-498/? E/InputEventReceiver: Exception dispatching input event.
03-30 12:17:32.066 498-498/? E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
03-30 12:17:32.086 612-612/? I/Choreographer: Skipped 81 frames!  The application may be doing too much work on its main thread.
03-30 12:17:32.096 498-498/? E/MessageQueue-JNI: java.lang.OutOfMemoryError: Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM
                                                 at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                                 at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                                 at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856)
                                                 at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675)
                                                 at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2230)
                                                 at android.content.res.Resources.loadDrawableForCookie(Resources.java:4279)
                                                 at android.content.res.Resources.loadDrawable(Resources.java:4153)
                                                 at android.content.res.Resources.loadDrawable(Resources.java:3998)
                                                 at android.content.res.TypedArray.getDrawable(TypedArray.java:886)
                                                 at android.widget.ImageView.<init>(ImageView.java:157)
                                                 at android.widget.ImageView.<init>(ImageView.java:145)
                                                 at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:60)
                                                 at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
                                                 at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
                                                 at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1017)
                                                 at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1076)
                                                 at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
                                                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:758)
                                                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
                                                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
                                                 at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
                                                 at com.miniproject32.writeup.MyPagerAdapter.instantiateItem(MyPagerAdapter.java:40)
                                                 at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:111)
                                                 at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1038)
                                                 at android.support.v4.view.ViewPager.populate(ViewPager.java:1252)
                                                 at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                                                 at android.support.v4.view.ViewPager$3.run(ViewPager.java:277)
                                                 at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:2029)
                                                 at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2159)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2371)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2866)
                                                 at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1861)
                                                 at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                                                 at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
                                                 at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2827)
                                                a
03-30 12:17:32.096 498-498/? D/AndroidRuntime: Shutting down VM
03-30 12:17:32.106 498-498/? E/AndroidRuntime: FATAL EXCEPTION: main
                                           Process: com.miniproject32.writeup, PID: 498
                                           java.lang.OutOfMemoryError: Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM
                                               at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                               at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                               at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856)
                                               at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675)
                                               at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2230)
                                               at android.content.res.Resources.loadDrawableForCookie(Resources.java:4279)
                                               at android.content.res.Resources.loadDrawable(Resources.java:4153)
                                               at android.content.res.Resources.loadDrawable(Resources.java:3998)
                                               at android.content.res.TypedArray.getDrawable(TypedArray.java:886)
                                               at android.widget.ImageView.<init>(ImageView.java:157)
                                               at android.widget.ImageView.<init>(ImageView.java:145)
                                               at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:60)
                                               at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
                                               at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
                                               at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1017)
                                               at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1076)
                                               at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
                                               at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:758)
                                               at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
                                               at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
                                               at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
                                               at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
                                               at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
                                               at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
                                               at com.miniproject32.writeup.MyPagerAdapter.instantiateItem(MyPagerAdapter.java:40)
                                               at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:111)
                                               at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1038)
                                               at android.support.v4.view.ViewPager.populate(ViewPager.java:1252)
                                               at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                                               at android.support.v4.view.ViewPager$3.run(ViewPager.java:277)
                                               at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:2029)
                                               at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2159)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2371)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2866)
                                               at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1861)
                                               at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                                               at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
                                            at com.android.internal.policy.P

我该如何解决这个问题?请帮忙

【问题讨论】:

  • 在清单中尝试android:largeHeap="true"
  • 您很可能希望使用“FragmentPagerAdapter”或“FragmentStatePagerAdapter”
  • 缩放位图图像,然后设置为ImageView。

标签: java android out-of-memory android-imageview android-bitmap


【解决方案1】:

java.lang.OutOfMemoryError: 未能分配 38125292 字节分配,其中 16777216 个可用字节和 21MB 直到 OOM

您正在尝试分配重 38MB 的图像。太多了。

要么减轻源图像的重量,要么必须 downsample the image 然后加载它。

【讨论】:

    【解决方案2】:

    尝试使用 Glide 或 Picasso 加载图像。

    滑翔

    进入项目级build.gradle

    dependencies {
        compile 'com.github.bumptech.glide:glide:3.5.2'
        compile 'com.android.support:support-v4:22.0.0'
    }
    

    在显示图像时,

    Glide.with(context)
        .load("imageURL")
        .into(ivImg);
    

    为 Piccaso

    dependencies {
        compile 'com.squareup.picasso:picasso:2.5.1'
    }
    

    在显示图像时,

    Picasso.with(context)
        .load(imageURL)
        .into(ivImg);
    

    【讨论】:

      【解决方案3】:

      尝试使用 Glide 或 Picasso 加载图像。

      滑翔

      进入项目级 build.gradle

      dependencies {
          compile 'com.github.bumptech.glide:glide:3.5.2'
          compile 'com.android.support:support-v4:22.0.0'
      }
      

      在显示图像时,

      Glide.with(context)
          .load("imageURL")
          .into(ivImg);
      

      为 Piccaso

      dependencies {
          compile 'com.squareup.picasso:picasso:2.5.1'
      }
      

      在显示图像时,

      Picasso.with(context)
          .load(imageURL)
          .into(ivImg);
      

      【讨论】:

        【解决方案4】:

        您在清单中添加此代码 android:largeHeap="true"。 然后,您可以按照此步骤进行操作

        1. 转到运行 -> 运行配置
        2. 选择maven build下的项目
        3. 选择标签“JRE”
        4. 输入 -Xmx1024m

        或者,你可以这样做

        1. 转到运行 -> 运行配置
        2. 选择标签“JRE”
        3. 输入 -Xmx1024m

        这应该会增加所有构建/项目的内存堆。您可以按照自己的方式对其进行优化。

        【讨论】:

        • 这就像说“您可以通过增加可用内存量来修复内存泄漏”。当然,它有效,但它助长了坏习惯——比如不修复内存泄漏。在这种情况下,最好的做法是一开始就不要分配 38MB 内存,不要让它在你用完整个 GB 内存之前不会引起问题。
        猜你喜欢
        • 1970-01-01
        • 2021-04-30
        • 2020-03-25
        • 2020-02-14
        • 1970-01-01
        • 2021-10-23
        相关资源
        最近更新 更多