当我加载我的应用程序时,它需要大约 3Mb 的 RAM。我的第一个 Activity 中有一个 ImageButton
,它调用函数 showRecords
,它会显示一个对话框。
对话框打开后,可以通过在框外单击来关闭它(这将调用 dismiss()
方法)。我遇到的问题是,在对话框关闭后,我的应用程序使用的 RAM 量不会恢复到以前的状态(如果我在对话框中包含其他内容,它可以保持超过 1 Mb - 但示例保留大约 2-300kb)
public void showRecords(View v){
Dialog recordDialog = new Dialog(this);
recordDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
recordDialog.setCanceledOnTouchOutside(true);
recordDialog.setContentView(R.layout.record);
recordDialog.show();
}
record.xml文件有一个图片背景,还有一个带图片的ImageView。
我试过使用 MAT,但在内存中看不到 Dialog 对象。我也一直在使用 DDMS 执行垃圾收集,但 RAM 值从未恢复到我期望的值。
Activity 是否有约束力?还是 GC 只是拒绝回收内存?
因为这是我的第一个 Activity ,所以它始终保持 Activity 状态,并且如果我需要更多堆空间(出于某种原因),它似乎不会关闭。因此,我对在不需要时回收 Mb 内存非常感兴趣。
编辑 - record.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/background"
android:orientation="vertical"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/recordspage"
android:layout_marginTop="5dp"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
/>
</LinearLayout>
最佳答案
好的,现在分析已经结束了......:-)
位图资源占用大量堆空间,因为与您可能开始使用的 PNG 或 JPEG 相比,它们在内存中以原始未压缩格式保存。
我注意到您正在为 LinearLayout
设置背景。这当然有效,但位图背景可能是最大的内存消耗,只是因为它们的大小。如果您担心空间不足,您可能会考虑使用纯色、ShapeDrawable
或堆占用较少的东西。对于对话框来说尤其如此,它通常只在屏幕上停留片刻。
关于android - 对话框内存泄漏还是顽固的 GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271373/