【发布时间】:2016-02-12 18:39:33
【问题描述】:
我知道这可能是一个愚蠢的问题,但我在开发 android 方面还很陌生,我目前在我的应用程序中遇到 OutOfMemoryError,我曾尝试使用 MAT 进行调试,但仍然很难找到泄漏在一些活动中,我发现了 LeakCanary,它看起来更简单易用,但是我找不到任何使用 Leak Canary 的初学者逐步指南,即使在 Google 上也是如此。我已经通过 build.gradle 中的依赖项安装了 LeakCanary,这就是我目前得到的:
ExampleApplication.java
public class ExampleApplication extends Application {
public static RefWatcher getRefWatcher(Context context) {
ExampleApplication application = (ExampleApplication) context.getApplicationContext();
return application.refWatcher;
}
private RefWatcher refWatcher;
@Override
public void onCreate() {
super.onCreate();
refWatcher = LeakCanary.install(this);
}
final class KeyedWeakReference extends WeakReference<Object> {
public final String key;
public final String name;
KeyedWeakReference(Object referent, String key, String name,
ReferenceQueue<Object> referenceQueue) {
super(checkNotNull(referent, "referent"), checkNotNull(referenceQueue, "referenceQueue"));
this.key = checkNotNull(key, "key");
this.name = checkNotNull(name, "name");
}
}
public void watch(Object watchedReference, String referenceName) {
checkNotNull(watchedReference, "watchReference");
checkNotNull(referenceName, "referenceName");
if(debuggerControl.isDebuggerAttached()) {
return;
}
final long watchStartNanoTime = System.nanoTime();
String key = UUID.randomUUID().toString();
retainedKeys.add(key);
final KeyedWeakReference reference =
new KeyedWeakReference(watchedReference, key, referenceName, queue);
watchExecutor.execute()
}
}
假设我有一个 Activity,我希望 LeakCanary 观察一个对象
SampleActivity.java
public class SampleActivity extends Activity implements View.OnClickListener {
ImageView level001, level002;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.choose_level);
level001 = (ImageView) findViewById(R.id.level001);
level002 = (ImageView) findViewById(R.id.level002);
// Do all kinds of function
// How do I use LeakCanary to watch these objects ?
}
}
现在我如何使用 LeakCanary 来查看导致内存泄漏的对象。感谢您的帮助和帮助。
【问题讨论】:
-
请记住,OutOfMemoryError 并不一定意味着您有内存泄漏。您可能只是试图绘制过多的资源,或者您只是在资产中使用了过多的内存等。如果您使用的是模拟器,首先尝试简单地增加 RAM 以查看是否可以解决问题。
-
不,这是由内存泄漏引起的,我已经使用 DDMS 检查堆转储,即使活动已关闭,分配的内存仍然存在,没有垃圾收集,它只是保持越来越大,直到应用崩溃。
-
我有同样的问题,但没有找到答案。我看过几个视频。但是,没有一个显示如何启动应用程序并查看泄漏对象的路径的基础知识。例如,您应该从 Android Studio 还是从设备启动应用程序?它可以在模拟器上运行吗?我收到了通知,但为什么我在泄漏应用程序中看不到它们?我有多个 Leaks 应用程序,我应该删除一些吗?这似乎是一个很棒的系统,但基础还不清楚。
标签: java android memory-leaks leakcanary