【问题标题】:Stuck at "Dumping memory, app will freeze. Brrr." message卡在“转储内存,应用程序将冻结。Brrr。”信息
【发布时间】:2015-09-29 19:41:51
【问题描述】:

我正在尝试使用 LeakCanary 来检测我的应用程序中的内存泄漏,但它并没有比“转储内存,应用程序将冻结。Brrr”消息更进一步。我已经等了大约 20 分钟左右,但没有任何变化。这些设备上的相同行为: 1. 华硕 fonepad 8(Android 5.0 现货) 2.索尼Xperia SP(安卓5.1.1 CM 12.1自定义) 3. HTC Desire C (Android 4.4 CM 11 自定义)

我按照指示做了一切:

public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}

【问题讨论】:

  • 遇到同样的问题,不知道如何解决...
  • 在运行 Android M 的 Nexus 5 上也是如此......从那以后有人设法修复它吗?
  • 只要库按预期工作并在大约 10 秒内完成转储。然后我打开LeakActivity,发现主要的泄漏源是... LeakActivity oO
  • @SergeyMaslov 你能选择一个正确的答案吗?
  • @JaredBurrows 不,因为据你所知,我没有使用 android M

标签: android memory-leaks leakcanary


【解决方案1】:

您应该将 RefWatcher 添加到您的片段中,就像项目页面上描述的一样:https://github.com/square/leakcanary

LeakCanary.install() 返回一个预配置的 RefWatcher。它还安装了一个 ActivityRefWatcher,它会在调用 Activity.onDestroy() 后自动检测活动是否泄漏。

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);
  }
}

您可以使用 RefWatcher 来监视片段泄漏:

public abstract class BaseFragment extends Fragment {

  @Override public void onDestroy() {
    super.onDestroy();
    RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
    refWatcher.watch(this);
  }
}

此外,如果您想在发生内存泄漏时获取堆转储,只需从 Android Studio 中打开 Android 设备监视器,然后选择“文件资源管理器”选项卡。在目录 /mnt/shell/emulated/0/Download/leakcanary/detected_leaks 中,您会找到所有堆转储文件。

【讨论】:

  • 这不能回答 OP 的问题。
  • 请检查 refWatcher 在 Fragments 中的使用是否正确。如果不是,则无法判断是否真的发生了内存泄漏,因为消息“正在转储内存,应用程序将冻结。Brrr”。仅表示带有堆转储的“疑似”内存泄漏。
  • 对不起,如果我误解了...... OP 没有具体提到任何关于 Fragments 的内容。在他们的情况下(我也是),我们所做的只是将LeakCanary.install(this) 行放入Application#onCreate() 方法中。
【解决方案2】:

如果您使用的是 Android M,则需要授予“写入外部存储”权限,否则泄漏金丝雀将在 brrr 消息中挂起很长时间。在您的应用程序抽屉中,长按泄漏金丝雀的启动器(就像您要卸载它一样)并向上拖动到“应用程序信息”并打开存储权限。

【讨论】:

  • Android M 正慢慢成为我存在的祸根。我什至没有怀疑这会是问题所在,但确实如此。 GitHub 上有一个未解决的问题,因此希望它在未来的版本中得到修复。
  • @bsautner 这在 1.4-beta1 版本的 Leakcanary 中已修复。 Handle storage permission on M : When a potential leak is detected, if the storage permission is missing, we drop the leak and we show a notification. That notification will then show the permission dialog.
  • 如果我不在 M 上但仍然出现此错误怎么办?我有一个在 L 上运行的应用程序,具有读写外部存储权限,但仍然看到这个烦人的对话框。有什么建议吗?
  • 在 N 上出现此错误,但无法启用权限,尽管它存在于清单中。
  • 这是一个很老的问题。也许更新你的泄漏金丝雀版本?我认为他们解决了这个问题。
猜你喜欢
  • 2011-07-25
  • 2013-03-16
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
相关资源
最近更新 更多