android内存
# 内存分配和管理机制
在 Android 进程中,整体的内存可以大致分为以下几部分,每一部分都有各自的分配和管理机制:
总体来说,Dalvik/ART Heap 与 Native Heap 是应用内存的主要组成部分:
Dalvik/ART Heap:主要负责 Java 层的对象存储,内存大小固定(由系统配置),过多的对象会导致 OOM。Native Heap:主要用于原生代码分配的内存,虽然没有严格的虚拟机内部上限,但最终也会受到整个进程内存和设备物理内存的限制。
此外,不同区域的内存分配方式和回收机制各异(比如 Dalvik/ART 的垃圾回收与 native 的 malloc/free),理解这些有助于更好地优化和排查内存问题。
# Dalvik(或 ART)Heap
用于存放 Java 对象(即应用代码中新创建的对象),由 Dalvik/ART 虚拟机管理。
受限于每个进程的堆大小(例如
dalvik.vm.heapsize参数),因此当应用创建的对象过多时可能触发 OOM。现代 Android(ART)中,采用 AOT 编译后,内存管理虽然有变化,但 Java 对象仍在这块堆内分配。
用户可以根据
adb shell getprop过滤 heap 查看设备设置的heap相关设备
# Native Heap
用于 C/C++ 代码通过
malloc/new分配的内存,或者通过 JNI 调用分配的内存。不受
Dalvik/ART堆大小限制,但仍受整个进程虚拟内存和物理 RAM 限制。包括一些系统库、第三方原生库以及底层驱动(如 OpenGL ES 驱动)的内存分配。
# 其他映射区域与内存
Stack:每个线程都有自己的调用栈,存放局部变量、函数调用信息等,通常较小(几 MB)。mmap映射:包括.so、.dex、.apk 等文件映射,这部分内存由操作系统通过 mmap 分配,并且可能会与其他进程共享(例如只读共享库)。Graphics Heap / GFX:主要与 GPU 显存相关,包括纹理、缓冲区、渲染状态等,这部分通常会通过特定的驱动接口管理。
上次更新: 2025/04/01, 16:51:44