【问题标题】:Android Activity leak in very simple setupAndroid Activity 在非常简单的设置中泄漏
【发布时间】:2016-11-23 00:13:05
【问题描述】:

我有一个由 2 个非常简单的 Activity 对象组成的系统 - MainActivity 启动 TestActivity,它上面有一个非常大的图像。在 TestActivity 中,我按下返回按钮并返回 MainActivity,但是我的内存(大约 45-50m)没有被 GCed。有什么想法吗?

MainActivity.java

            public class MainActivity extends Activity {

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

                Intent intent = new Intent(this, TestActivity.class);
                startActivity(intent);
            }
        }

TestActivity.java

    public class TestActivity extends Activity {

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


        @Override
        public void onBackPressed() {
            super.onBackPressed();
        }


    }

MainActivity 布局

<?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: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.leaked.leaked.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    </RelativeLayout>

TestActivity 布局

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        xmlns:android="http://schemas.android.com/apk/res/android">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/earth_poster_large"/>
    </FrameLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.leaked.leaked">

    <application>
        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        </activity>
        <activity android:name=".TestActivity">
        </activity>
    </application>

</manifest>

【问题讨论】:

  • 真的是内存泄漏吗?
  • 看起来是这样。做了一个堆转储并在 Android Studio 中分析它。将图片添加到问题正文。另外,它真的不是垃圾收集那么大的内存(我专门在 TestActivity 的布局中使用了一个非常大的图像)

标签: java android android-activity memory-leaks


【解决方案1】:

当您不再需要 ImageView 占用的内存时,您应该释放它。 在您的情况下,您可以在 TestActivity 的 onDestroy() 中使用这个 -

yourImageView.setImageDrawable(null);

【讨论】:

  • 好的。做过某事。补充:((ImageView)findViewById(R.id.huge_image)).setImageDrawable(null); 它确实减少了分配的内存。但是,该活动仍显示在 Android Studio 中堆转储分析器的“泄漏”下拉列表中。
  • 我实际上添加了巨大的图像只是为了能够快速看到内存正在被占用。在此之前,我没有图像 - 那时 TestActivity 也在泄漏。
【解决方案2】:

您可以做的一件事是通过手动调用finish() destroy activity

但仍然不能保证内存不会被占用。

【讨论】:

  • 嗯。我的印象是一旦 onDestroy() 被调用,并且没有内存泄漏(如静态上下文或类似的东西),活动将被垃圾收集。
【解决方案3】:

我想真的没有泄漏。如果我尝试启动一些大型测试活动,它将成功显示“泄露的活动”。我猜出于性能原因,Android 运行时不会立即 gc 这些活动,即也许用户将来会再次回到它们。只有经过足够长的时间,它才会 gc 这些杂散活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2014-05-19
    • 2012-04-03
    相关资源
    最近更新 更多