【发布时间】:2011-10-25 14:39:42
【问题描述】:
我已经成功完成了一个 Android 项目的实现,并开始测试应用程序的内存泄漏。
有时,我在应用程序中长途旅行后收到DeadObjectException,并且所有内存分配都被释放。
我怎样才能发现这个问题?
我对检测内存泄漏的 DDMS 工具进行了一些研究,由于我不知道 DeadObjectExeption,我不知道从哪里开始。
【问题讨论】:
标签: android memory-leaks ddms
我已经成功完成了一个 Android 项目的实现,并开始测试应用程序的内存泄漏。
有时,我在应用程序中长途旅行后收到DeadObjectException,并且所有内存分配都被释放。
我怎样才能发现这个问题?
我对检测内存泄漏的 DDMS 工具进行了一些研究,由于我不知道 DeadObjectExeption,我不知道从哪里开始。
【问题讨论】:
标签: android memory-leaks ddms
这不是内存泄漏问题。内存泄漏的定义(来自维基百科):
计算机科学中的内存泄漏(或在此上下文中的泄漏), 当计算机程序获取内存但未能释放它时发生 回到操作系统。
在这里,你有一个相反的情况 - 内存在它应该释放之前被释放(至少从你的程序的角度来看)。
来自 developer.android.com:
DeadObjectException 扩展 RemoteException
你调用的对象已经死掉,因为它的宿主进程已经不存在了。
例如:
您有 MyActivity 和 MyService 类。你使用Handler/Messenger在它们之间进行通信。
您在MyActivity 中创建Handler 和Messenger,然后通过Intent 将创建的Messenger 实例发送到MyService。然后你做一些事情,时间过去了,你的MyActivity 连同它的Handler 和Messenger 一起被销毁。现在,如果你处理不好,MyService 不会知道他拥有的Messenger 不再有效,所以,他试图通过它发送一些东西,并得到DeadObjectexception:
/* 向该 Messenger 的处理程序发送消息。
参数:
message 要发送的消息。通常通过 Message.obtain() 获取。
投掷:
RemoteException 如果目标处理程序不再存在,则抛出 DeadObjectException。*/
public void send(Message message) throws RemoteException {...}
【讨论】:
如果您从 Native Library(.so 文件)调用任何函数,只需检查创建 JNI 函数时使用的包名称是否与您在 Java 类中声明本地方法相同。
【讨论】: