我有一个非常复杂的应用程序正在泄漏内存。为了追踪泄漏,我将启动器应用程序剥离为一个非常简单的 Android 应用程序,该应用程序在导航到下一个 Activity 时仍然泄漏 Activity 。我使用 Android Studio 中的 hprof 分析器发现了泄漏。整个精简的启动器 Activity 是:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class HomeTest extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnStaffStart = (Button)findViewById(R.id.btnStaffStart);
btnStaffStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent startNewActivityOpen = new Intent(HomeTest.this, StaffMenu.class);
startActivity(startNewActivityOpen);
finish();
}
});
}
}
当我导航到 StaffMenu Activity 时,分析器显示 HomeTest Activity 的泄漏。如果有的话,我做错了什么,或者启动 Activity 总是泄漏 Android 中的内存吗?我没有收到 OutOfMemory 错误消息,我只是不喜欢泄漏内存。该应用程序没有分配太多内存,因此可用内存非常少,即使在精简的 Activity 中也是如此(小于 1%)。
我运行的是 Android 4.2、4.4 和 5.1。
编辑 我刚刚尝试了另一个应用程序,它还在导航到下一个 Activity 后泄漏了启动器 Activity 。已知的 Android 错误???
最佳答案
这段代码没有内存泄漏。我无法解释内存泄漏分析器的结果,但我不会完全相信,因为这个特定功能是在上一个 AS 版本中引入的。
您是否检查过在这两个 Activity 之间多次导航时有多少个 Activity 实例?您可以在终端 adb shell dumpsys meminfo <package_name|pid>
中使用此命令来检查这一点或在“Android Monitor”角度使用 AS。您的案例中不应有超过 2 个 Activity Activity 。
如果您想确定,我建议您使用MAT内存分析器。如何使用你可以找here .
编辑:这是另一个好东西 option确保您的 Activity 不被泄露。 Example如何在 Activity 泄漏时转储内存堆。
关于java - 非常简单的 Android 应用程序中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34075810/