Android 内存测试
Android memory test
这可能是一个愚蠢的问题,但我似乎无法在互联网上找到很多具体信息。
假设我有 2 个活动:MainActivity 和 Secondactivity。
mainactivity 有一个按钮可以转到 secondactivity。
第二个 activity 有一个返回到
main activity(下面的代码非常简单)。
我想了解 android 内存管理,这就是我进行此测试的原因。
我的问题:
当我不断地在活动之间来回切换时,在 Android studio 中查看内存图时,我可以看到一个蓝色的图,它永远不会回到它在启动时分配的内存的应用程序。
我有内存泄漏吗? (可能不是因为这是基本代码)。但是为什么它永远不会回到一开始就分配给它的原始内存?
mainactivity只有这个方法:
@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));
}
});
}
}
蓝色图表是分配的内存量。
为什么分配的内存增加
当您在这两个活动之间来回切换时,正在为您的应用程序分配内存以创建新活动。
为什么分配的内存没有减少
它不会减少,因为内存在垃圾收集期间被释放。 Dalvikvm 将确定何时应进行垃圾回收,因此有可能在较长时间内不进行垃圾回收。您可以继续在这两个活动之间来回切换以增加分配的内存,一旦分配的内存足够大,您应该会看到分配的内存量突然下降。
为什么分配的内存突然下降
发生垃圾回收时释放分配的内存。如果您查看 android studio 中的 logcat,分配内存的突然下降应该伴随着 Dalvikvm GC_something 已释放消息。这意味着垃圾收集已经发生并且内存被释放。您可以通过单击启动 GC 按钮(蓝色图表的左侧)手动触发垃圾收集来观察这种情况。
您的代码中没有内存泄漏。分配内存增加的原因是因为您的应用程序将使用一些内存以转移到不同的活动。但是,如果你一直运行这个代码,你会看到突然下降,我已经画出来了:
每次发生垃圾回收时,分配的内存都会减少。但是,如果发生内存泄漏,则意味着 GC 将无法清除某些对象。为此,您会看到 趋势线 普遍增加,直到发生内存不足错误。
你如何测试这个?
我建议您这样做,以便在 onCreate
中调用意图以实现 back-and-forth 活动的无限循环。除非出现 OutOfMemory
错误,否则您可能没有内存泄漏。
As you allocate more objects in your app, you will force a periodic
garbage collection, creating little "hiccups" in the user experience.
The concurrent garbage collector introduced in Android 2.3 helps, but
unnecessary work should always be avoided.
这只是垃圾回收 (GC) 的问题。即使您编写最少的代码,框架也可能在幕后执行大量工作。实际上,您在每次点击时都明确地创建了一些对象。
这是内存图,可以看到GC的效果。
我认为问题在于使用 genymotion 作为模拟器。
您应该使用真实设备进行内存分析,而且较旧的内存监视器更精确。
这可能是一个愚蠢的问题,但我似乎无法在互联网上找到很多具体信息。
假设我有 2 个活动:MainActivity 和 Secondactivity。 mainactivity 有一个按钮可以转到 secondactivity。 第二个 activity 有一个返回到 main activity(下面的代码非常简单)。
我想了解 android 内存管理,这就是我进行此测试的原因。
我的问题:
当我不断地在活动之间来回切换时,在 Android studio 中查看内存图时,我可以看到一个蓝色的图,它永远不会回到它在启动时分配的内存的应用程序。 我有内存泄漏吗? (可能不是因为这是基本代码)。但是为什么它永远不会回到一开始就分配给它的原始内存?
mainactivity只有这个方法:
@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));
}
});
}
}
蓝色图表是分配的内存量。
为什么分配的内存增加
当您在这两个活动之间来回切换时,正在为您的应用程序分配内存以创建新活动。
为什么分配的内存没有减少
它不会减少,因为内存在垃圾收集期间被释放。 Dalvikvm 将确定何时应进行垃圾回收,因此有可能在较长时间内不进行垃圾回收。您可以继续在这两个活动之间来回切换以增加分配的内存,一旦分配的内存足够大,您应该会看到分配的内存量突然下降。
为什么分配的内存突然下降
发生垃圾回收时释放分配的内存。如果您查看 android studio 中的 logcat,分配内存的突然下降应该伴随着 Dalvikvm GC_something 已释放消息。这意味着垃圾收集已经发生并且内存被释放。您可以通过单击启动 GC 按钮(蓝色图表的左侧)手动触发垃圾收集来观察这种情况。
您的代码中没有内存泄漏。分配内存增加的原因是因为您的应用程序将使用一些内存以转移到不同的活动。但是,如果你一直运行这个代码,你会看到突然下降,我已经画出来了:
每次发生垃圾回收时,分配的内存都会减少。但是,如果发生内存泄漏,则意味着 GC 将无法清除某些对象。为此,您会看到 趋势线 普遍增加,直到发生内存不足错误。
你如何测试这个?
我建议您这样做,以便在 onCreate
中调用意图以实现 back-and-forth 活动的无限循环。除非出现 OutOfMemory
错误,否则您可能没有内存泄漏。
As you allocate more objects in your app, you will force a periodic garbage collection, creating little "hiccups" in the user experience. The concurrent garbage collector introduced in Android 2.3 helps, but unnecessary work should always be avoided.
这只是垃圾回收 (GC) 的问题。即使您编写最少的代码,框架也可能在幕后执行大量工作。实际上,您在每次点击时都明确地创建了一些对象。
这是内存图,可以看到GC的效果。
我认为问题在于使用 genymotion 作为模拟器。 您应该使用真实设备进行内存分析,而且较旧的内存监视器更精确。