dumpsys meminfo详情
dumpsys meminfo surfaceflinger
Applications Memory Usage (in Kilobytes):
Uptime: 14170420 Realtime: 14170420
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 6764 6764 0 0 0 0 0
Dalvik Heap 0 0 0 0 0 0 0
Stack 60 60 0 12
Ashmem 60 0 0 0
Gfx dev 3324 3324 0 0
Other dev 17 0 16 0
.so mmap 10102 2184 3244 0
Other mmap 44 8 24 28
EGL mtrack 97608 97608 0 0
Unknown 832 820 12 116
TOTAL 118967 110768 3296 156 0 0 0
App Summary
Pss(KB)
------
Java Heap: 0
Native Heap: 6764
Code: 5428
Stack: 60
Graphics: 100932
Private Other: 880
System: 4903
cat /sys/class/kgsl/kgsl/proc/14708/gpumem_mapped
3403776
at /sys/class/kgsl/kgsl/proc/14708/imported_mem
99950592
Graphics= EGL mtrack + Gfx dev,EGL mtrack主要是SurfaceView和TextureView的总和,Gfx dev是驱动反馈的GPU内存,主要是GL纹理大小的总和
获取流程图
Gfx dev
Gfx dev的值是从/sys/class/kgsl/kgsl/proc/pid/gpumem_mapped下读取的,这里主要为/dev/kgsl-3d0占用的空间,gpu使用的内存
cat /proc/14708/smaps | grep kgsl
7ffd00000-7ffd20000 rw-s 00143000 00:11 28946 /dev/kgsl-3d0
7ffd26000-7ffd28000 rw-s 00139000 00:11 28946 /dev/kgsl-3d0
7ffd28000-7ffd2c000 rw-s 00142000 00:11 28946 /dev/kgsl-3d0
7ffd2c000-7ffd30000 rw-s 00141000 00:11 28946 /dev/kgsl-3d0
7ffd30000-7ffd70000 rw-s 00140000 00:11 28946 /dev/kgsl-3d0
7ffd70000-7ffdb0000 rw-s 0013f000 00:11 28946 /dev/kgsl-3d0
7ffdb0000-7ffe70000 rw-s 0013e000 00:11 28946 /dev/kgsl-3d0
7ffe70000-7ffe90000 rw-s 0013d000 00:11 28946 /dev/kgsl-3d0
7ffe90000-7ffeb0000 rw-s 0013b000 00:11 28946 /dev/kgsl-3d0
7ffeb1000-7ffeb3000 rw-s 00149000 00:11 28946 /dev/kgsl-3d0
......
smaps中所有kgsl-3d0内存加起来等于gpumem_mapped中读到的内存
EGL mtrack
EGL mTrack 主要是APP eglWindowSurface,
包括normal HWUI based app windowsurface, SurfaceView, TextureView.
这部分内存是从SurfaceFlinger 分配的,可以跟 dumpsys SurfaceFlingher 的 Alloated buffers 可以对应上
static ssize_t
imported_mem_show(struct kgsl_process_private *priv,
int type, char *buf)
{
struct kgsl_mem_entry *entry;
uint64_t imported_mem = 0;
int id = 0;
spin_lock(&priv->mem_lock);
for (entry = idr_get_next(&priv->mem_idr, &id); entry;
id++, entry = idr_get_next(&priv->mem_idr, &id)) {
int egl_surface_count = 0, egl_image_count = 0;
struct kgsl_memdesc *m;
if (kgsl_mem_entry_get(entry) == 0)
continue;
spin_unlock(&priv->mem_lock);
m = &entry->memdesc;
// 如果是ION内存
if (kgsl_memdesc_usermem_type(m) == KGSL_MEM_ENTRY_ION) {
kgsl_get_egl_counts(entry, &egl_surface_count,
&egl_image_count);
// 如果是egl_surface
if (kgsl_memdesc_get_memtype(m) ==
KGSL_MEMTYPE_EGL_SURFACE)
imported_mem += m->size;
else if (egl_surface_count == 0) {
uint64_t size = m->size;
// 如果在多个进程中使用那么计算内存时会是1/N
do_div(size, (egl_image_count ?
egl_image_count : 1));
imported_mem += size;
}
}
kgsl_mem_entry_put(entry);
spin_lock(&priv->mem_lock);
}
spin_unlock(&priv->mem_lock);
return scnprintf(buf, PAGE_SIZE, "%llu\n", imported_mem);
}
EGL mtrack和surfaceflinger中Allocated buffers的关系
Allocated buffers:
0x744340ffe0: 32400.00 KiB | 3840 (3840) x 2160 | 1 | 1 | 0x1a00 | FramebufferSurface
0x7443410050: 32400.00 KiB | 3840 (3840) x 2160 | 1 | 1 | 0x1a00 | FramebufferSurface
0x74434100c0: 32400.00 KiB | 3840 (3840) x 2160 | 1 | 1 | 0x1a00 | FramebufferSurface
0x7443410fa0: 16.00 KiB | 64 ( 64) x 64 | 1 | 1 | 0x333 | screenshot
0x7443411be0: 8100.00 KiB | 1920 (1920) x 1080 | 1 | 1 | 0x10000900 | com.konka.livelauncher/com.konka.livelauncher.TrueLauncher#0
0x7443411cc0: 8100.00 KiB | 1920 (1920) x 1080 | 1 | 1 | 0x10000900 | com.konka.livelauncher/com.konka.livelauncher.TrueLauncher#0
0x74434122e0: 8100.00 KiB | 1920 (1920) x 1080 | 1 | 1 | 0x10000900 | global_recents#0
0x74434129e0: 8100.00 KiB | 1920 (1920) x 1080 | 1 | 1 | 0x10000900 | com.konka.livelauncher/com.konka.livelauncher.TrueLauncher#0
Total allocated (estimate): 129616.00 KB
从imported_mem_show中的计算我们可以知道,如果块buff和其多个进程共用那么计算进程EGL mtrack内存的时候就是1/N,没有共用的情况下就算到单个进程的EGL mtrack中
从Allocated buffers中我们可以看出surfaceflinger中FramebufferSurface的大小为32400*3=97200
但是EGL mtrack=97608,这两个值有点细微的差别,加了点日志从kgsl_setup_dma_buf中打印出来每块内存实际为值:33316864/1024=32536KB
surfaceflinger ] PZC kgsl_setup_dma_buf1 size = 33316864
实际值32536KB比Allocated buffers中的32400KB稍微大了一点,这里可能是为了内存对齐,导致了实际内存偏大了一点点
EGL mtrack中的内存是能和Allocated buffers中对应上的