检测Android JNI代码中的本机内存泄漏

时间:2010-09-22 10:49:20

标签: android memory-leaks java-native-interface

如何检测Android JNI代码中的内存泄漏?我正在使用Froyo

3 个答案:

答案 0 :(得分:13)

适用于Android的

2017更新: valgrind is available。内置的malloc调试功能在Android N中得到了显着扩展,对于查找内存泄漏非常有用。您可能需要_exit()该应用才能触发转储。

下面描述的DDMS功能目前在官方文档中获得brief mention


您可以利用实验性的,不受支持的功能。

在DDMS配置文件中(例如Linux上的~/.android/ddms.cfg),添加“native = true”。这将启用“本机堆”选项卡。

接下来,在设备上启用本机堆分配跟踪,然后重新启动应用程序框架:

% adb shell setprop libc.debug.malloc 1 
% adb shell stop 
% adb shell start 

(注意这需要root。另请注意,这仅适用于最新版本;在旧版本中,您还需要手动将libc.so替换为设备上/ system / lib中的libc_debug.so。)

通过在发出简单命令(“adb shell ls”)时观察logcat输出,您可以判断是否已正确配置设备。如果你看到:

I/libc    ( 4847): ls using MALLOC_DEBUG = 1 (leak checker)

然后你知道你启用了它。

现在,您可以使用“本机堆”选项卡功能来获取堆内存使用情况的快照。

DDMS会自动从Android源代码树中的.../symbols/system/lib共享库中提取符号。当然,这要求您拥有完整的Android源代码树,并且您的设备正在运行从中构建的代码。否则,堆栈跟踪无法解码为符号名称,这会降低功能的实用性。

答案 1 :(得分:0)

你需要在测试运行之前和之后拍摄快照。 然后按+/-按钮 然后它将显示保留的内存位置。

答案 2 :(得分:0)

我也用过JB,JB +,KITKAT和棒棒糖。 它是在android中找到泄漏的非常好的工具。