在setContentView之后的30M处堆积

时间:2012-12-07 22:39:17

标签: android heap mat

启动我的应用程序时,堆大约是15M。在setContentView中调用MainActivity后,它会提升到大约30M。这种布局没有多少。这就是为什么我想知道这是否正常。当开始另一个Acticity时,它再次上升到大约40M并且不会再次下降。

那是main.xml的样子:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:background="@drawable/background"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/LinLAdMain"
        android:layout_width="match_parent"
        android:layout_height="88dp"
        android:layout_weight="0.70"
        android:orientation="vertical" >
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.70"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:contentDescription="@string/logo_description"
            android:src="@drawable/logo" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="0.14"
        android:orientation="vertical" >

        <Button
            android:id="@+id/button1"
            style="@style/StartButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:onClick="onClick"
            android:layout_margin="8dp" />

        <Button
            android:id="@+id/button2"
            style="@style/HighscoreButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:onClick="onClick"
            android:layout_margin="8dp" />

        <Button
            android:id="@+id/button3"
            style="@style/SettingsButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:onClick="onClick"
            android:layout_margin="8dp" />

    </LinearLayout>
</LinearLayout>

正如您所看到的,我使用的是背景可绘制的。但文件大约是60K ..

这就是setContentView()之后MAT-default-report的样子:

screenshot

这就是GC的路径(不包括弱引用):

screenshot screenshot

这些&#34; nexts&#34;在头类java.lang.ref.FinalizerReference结束,它告诉我什么。

正如我所说,每次活动都会变得更糟。例如之后 Main-&gt; Highscore-&gt; GlobalHighscore它不再可能启动Activity&#34; ingame&#34;。 希望你们能帮助我:)。

如果您需要更多信息/代码,请告诉我。

2 个答案:

答案 0 :(得分:2)

像PNG和JPG这样的图像文件格式正在使用压缩算法来减少已用磁盘空间。但是,当在Android应用程序中加载图像时,这些文件会被解压缩,并且可能会比原始文件大得多。

解压缩后使用的空间类似于将PNG或JPG文件转换为BMP 32位颜色时使用的磁盘空间。

示例

一个非常简单的全白画,尺寸为1024 x 1024像素,保存为PNG将使用几Kb。

解压缩成ARGB_8888后,它变成1024 x 1024 x 4字节的数组(最后4个代表每个像素使用4个字节,每个基本颜色RGB一个,Alpha代表一个)

1024 x 1024 x 4 = 4,194,304 = 4 MB

因此这个简单图像使用的内存为4 MB。

怎么做

减少图像使用的内存:

  • 使用仍然符合您要求的最小尺寸(宽度和高度) 您希望支持的不同屏幕尺寸的要求
  • 为不同的屏幕使用不同的尺寸(mdpi,hdpi等)。但是,这会增加您的应用程序大小。
  • 使用Draw 9 Patch创建小尺寸图像,以可预测和可控的方式扩展到大屏幕。

找出导致内存分配增加的内存泄漏。

可能您正在使用一些阻止GC收集内存的活动Context。最可能的原因是引用了Context / Activity的对象:

  • 线程
  • 处理程序
  • 浏览

尝试在不再需要时或在活动OnDestroy()

上将其归零

问候。

答案 1 :(得分:0)

android:src="@drawable/logo"并手动调整大小以适合您的屏幕,需要。我是指drawable文件夹中的logo.png。在320x480分辨率下,它不需要2560x1600像素!