2

I am working on an lwp where over time, the memory usage reported thru the UI (settings, apps, running) shows an ever increasing memory usage (starts at ~18M and has climbed as high as 90M before I nuked it). That seems very bad and got me hunting down what must be a memory leak. So I used ddms and it shows that while the the app shows increasing memory usage, the Dalvik allocated heap is ~13.7M and it doesn't vary more than ~500K over time. OK, so it must be on the native heap. I included a log of Debug.getNativeHeapSize() and Debug.getNativeHeapAllocatedSize() and they both report ~5M of native heap +/- ~2M, consistently as the UI shows the increasing memory usage. What other memory usage is there besides Dalvik and native? So I read Diane Hackborn's excellent post here and realized I had a lot more to learn. I used adb shell dumpsys meminfo and the result looked like:

** 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

The huge 33M "Pss" for "Other Dev" plus the Native/Pss and Dalvik/Pss is roughly what the UI is reporting for memory usage. Reading Diane's post, I don't know if I should be worried about my memory usage or not. I can see that that "Pss/Other dev" value is climbing over time but my native and Dalvik heap are remaining where ddms and the Debug.getNativeHeapSize() report they are. I'm confused and don't know if I should be concerned other than that users will see that my lwp is consuming this crazy amount of "memory" when as far as I can see, it is not actually leaking.

Does anyone understand what is going on here? This on a Galaxy Nexus, ICS 4.0.2.

EDIT: I subsequently tried to crash the app by letting the Other/Pss climb until the app reached ~200M of reported usage in the UI. It did crash:

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): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

So I have something to fix, I have no idea where to start since I can't see any problem on the dalvik or native heap.

trincot
  • 317,000
  • 35
  • 244
  • 286
Garnet Ulrich
  • 3,019
  • 1
  • 16
  • 10
  • Does it by chance leak memory every time you rotate the app? I've found this to be a surprisingly common leak scenario, due to holding onto a reference to the Context. – Yusuf X May 13 '12 at 04:54
  • I've had that problem a couple of years back Yusuf and I agree that it is common but it is not what is happening here. – Garnet Ulrich May 13 '12 at 12:58
  • 1
    OK, for visitors from the future with the same problem, the issue I had was that I was 'leaking' with ByteBuffer.allocateDirect in my opengl code. So the symptoms described above are what happens in that case. I have since solved the problem by releasing the memory properly. – Garnet Ulrich Jun 08 '12 at 17:26

0 Answers0