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