java.lang.OutOfMemoryError - 我该如何解决这个问题?

java.lang.OutOfMemoryError - How do I fix this?

我试图在一个 activity 中实现分页,但我 运行 内存不足。该应用程序运行到第 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 Class:

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;
}

}

这是第 1 页的 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>

所有其他页面都是这样,具有不同的可绘制对象。除了第 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>

这是logcat:

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.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.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

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

java.lang.OutOfMemoryError: Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM

您正在尝试分配一个大小为 38MB 的图像。太多了。

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

尝试使用 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);

对于毕加索

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

显示图像时,

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

您在清单中添加此代码 android:largeHeap="true"。 然后,你可以按照这个步骤

  1. 转到 运行 -> 运行 配置
  2. Select maven build下的项目
  3. Select 选项卡 "JRE"
  4. 输入-Xmx1024m

或者,您可以

  1. 转到 运行 -> 运行 配置
  2. Select 选项卡 "JRE"
  3. 输入-Xmx1024m

这应该会增加所有 builds/projects 的内存堆。您可以按照自己的方式进行优化。

尝试使用 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);

对于毕加索

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

显示图像时,

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