Android 安卓:我有内存泄漏吗?

Android 安卓:我有内存泄漏吗?,android,memory,heap,native,Android,Memory,Heap,Native,我正在开发一个lwp,随着时间的推移,通过UI设置、应用程序和运行报告的内存使用情况显示,不断增加的内存使用从约18M开始,在我使用核武器之前,已攀升至90M。这看起来很糟糕,让我找到了一定是内存泄漏的东西。因此,我使用了ddms,它表明,虽然应用程序的内存使用率不断增加,但Dalvik分配的堆约为1370万,并且随着时间的推移,其变化不会超过500K。好的,所以它必须在本机堆上。我包括了Debug.getNativeHeapSize和Debug.getNativeHeapLocatedSize

我正在开发一个lwp,随着时间的推移,通过UI设置、应用程序和运行报告的内存使用情况显示,不断增加的内存使用从约18M开始,在我使用核武器之前,已攀升至90M。这看起来很糟糕,让我找到了一定是内存泄漏的东西。因此,我使用了ddms,它表明,虽然应用程序的内存使用率不断增加,但Dalvik分配的堆约为1370万,并且随着时间的推移,其变化不会超过500K。好的,所以它必须在本机堆上。我包括了Debug.getNativeHeapSize和Debug.getNativeHeapLocatedSize的日志,它们都报告了~5M的本机堆+/-~2M,这与UI显示的内存使用量不断增加的情况一致。除了Dalvik和native之外,还有什么其他内存使用?所以我读了黛安·哈克伯恩的精彩文章,意识到我还有很多东西要学。我使用了adb shell dumpsys meminfo,结果如下所示:

** MEMINFO in pid 6856 **
                         Shared  Private     Heap     Heap     Heap
                   Pss    Dirty    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------
       Native     1118     1116     1076     5072     3452       59
       Dalvik     4102    16204     3584    15111    14077     1034
       Cursor        0        0        0                           
       Ashmem        2        4        0                           
    Other dev    33344      292      820
其他开发人员的3300万Pss加上本机/Pss和Dalvik/Pss,大致相当于UI报告的内存使用量。阅读黛安的帖子,我不知道我是否应该担心我的内存使用。我可以看到Pss/Other dev的值随着时间的推移而不断攀升,但我的原生堆和Dalvik堆仍保留在ddms和Debug.getNativeHeapSize报告所在的位置。我很困惑,不知道除了用户会看到我的lwp消耗了这么多的内存之外,我是否应该担心,就我所知,它实际上并没有泄漏

有人知道这里发生了什么吗?这是Galaxy Nexus,ICS 4.0.2上的

编辑:我随后试图让另一个/Pss爬升,使应用程序崩溃,直到应用程序在UI中达到约200米的报告使用量。它确实崩溃了:

E/IMGSRV  ( 8337): :0: __map: Map device memory failed
W/GraphicBufferMapper( 8337): registerBuffer(0x3364c0) failed -14 (Bad address)
F/libc    ( 8337): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
I/DEBUG   (  114): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

所以我有一些问题要解决,我不知道从哪里开始,因为我看不到dalvik或本机堆上有任何问题。

是否每次旋转应用程序时都会偶然泄漏内存?我发现这是一个令人惊讶的常见泄漏场景,因为我坚持引用上下文。我在几年前就遇到过这个问题,Yusuf,我同意这是很常见的,但这不是这里正在发生的事情。好吧,对于未来有同样问题的访客,我遇到的问题是,我在opengl代码中使用ByteBuffer.allocateDirect“泄漏”。因此,上述症状就是这种情况下发生的情况。我通过正确释放内存解决了这个问题。每次你旋转应用程序时,它是否会偶然泄漏内存?我发现这是一个令人惊讶的常见泄漏场景,因为我坚持引用上下文。我在几年前就遇到过这个问题,Yusuf,我同意这是很常见的,但这不是这里正在发生的事情。好吧,对于未来有同样问题的访客,我遇到的问题是,我在opengl代码中使用ByteBuffer.allocateDirect“泄漏”。因此,上述症状就是这种情况下发生的情况。我通过正确释放内存解决了这个问题。