这可能是一个愚蠢的问题,但我似乎无法在互联网上找到很多具体信息。
假设我有2项活动:MainActivity& Secondactivity。 mainactivity有一个按钮可以进入第二个活动。 第二个活动有一个按钮,可以返回到 主要活动(下面非常简单的代码)。
我正在尝试了解Android内存管理,以及我为什么要进行此测试。
我的问题:
当我经常在活动之间来回走动时,在查看Android工作室中的内存图时,我可以看到一个蓝色的图表,它永远不会回到它在启动时分配的内存。应用。 我有内存泄漏吗? (可能不是因为这是基本代码)。但是为什么它一开始就不会回到它原来分配的内存?
主要活动只有这种方法:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnTest = (Button) findViewById(R.id.btnTest);
btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Log.i(null, "test");
finish();
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});
}
虽然SecondAcitivity只是回到第一个并创建了一些按钮
public class SecondActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button btnTest = (Button) findViewById(R.id.btnTest);
btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Log.i(null, "test");
finish();
startActivity(new Intent(SecondActivity.this, MainActivity.class));
}
});
}
}
答案 0 :(得分:1)
我认为问题是使用genymotion作为模拟器。 您应该使用真实设备进行内存分析,旧内存监视器也更精确。
答案 1 :(得分:0)
代码中没有内存泄漏。分配内存增加的原因是因为您的应用程序将使用某些内容以便转移到不同的活动。但是,如果你继续永远运行这个代码,你会看到突然下降,我已经把它画出来了:
每次发生垃圾收集时,分配的内存都会关闭。但是,如果您有内存泄漏,这意味着GC将无法摆脱某些对象。为此,您会看到趋势线一般增加,直到发生内存不足错误。
我建议你这样做,以便在onCreate
中调用意图来进行无限循环的来回活动。除非您收到OutOfMemory
错误,否则您可能没有内存泄漏。
当您在应用中分配更多对象时,您将强制定期 垃圾收集,创造一点点"打嗝"在用户体验方面。 Android 2.3中引入的并发垃圾收集器有所帮助,但是 应始终避免不必要的工作。
答案 2 :(得分:-1)
蓝色图表是分配的内存量。
当您在两个活动之间来回切换时,您的应用程序将被分配内存以创建新活动。
它不会减少,因为在垃圾收集过程中释放了内存。 Dalvikvm将确定何时应该进行垃圾收集,因此垃圾收集可能不会在很长一段时间内发生。您可以继续在两个活动之间来回切换以增加分配的内存,一旦分配的内存足够大,您应该看到分配的内存量突然下降。
发生垃圾收集时释放已分配的内存。如果你看看android studio中的logcat,分配内存的突然下降应该伴随着Dalvikvm GC_something释放消息。这意味着发生了垃圾收集并释放了存储空间。您可以通过单击启动GC按钮(蓝色图表的左侧)来手动触发垃圾回收来观察这种情况。
答案 3 :(得分:-1)