文章目录Android 内存泄露和内存溢出1.Android 系统为每个 App 分配的内存有多大总结2.内存分配 DemoAndroid 内存泄露和内存溢出内存泄漏每创建一个对象系统都会为其分配内存。当对象使用完毕后Java 虚拟机会自动回收其所占内存。然而如果代码中存在隐蔽的引用问题导致某些对象虽然已不再使用、却仍被引用Java 虚拟机便不会回收这些对象——这就是内存泄漏。泄漏的对象不断累积所占内存逐渐增大一旦超过系统分配的上限就会引发内存溢出。内存溢出App 的内存占用超过系统允许的最大上限值导致程序无法继续分配内存最终崩溃退出。1.Android 系统为每个 App 分配的内存有多大Android 系统为每个应用分配的内存大小并非固定而是动态调整的具体取决于设备硬件、系统版本、厂商定制策略以及应用自身配置。以下是关键细节应用可用的内存主要分为两类Java 堆内存重点由 Java 虚拟机管理用于存储 Java 对象有明确的上限。Native 内存由操作系统直接分配主要用于 C/C 代码和 Bitmap 等大数据对象理论上没有严格上限但受设备物理内存限制。默认内存限制Java Heap不同时期和档次的设备Java 堆内存上限差异较大早期版本Android 2.x~4.x 单个应用的堆内存上限通常为 16MB~48MB低端设备可能更低。现代版本Android 5.0中低端设备64MB~128MB高端设备256MB~512MB部分旗舰机可达 1GB 以上。内存分配的影响因素(1) 设备硬件RAM 总容量低端设备2GB RAM可能限制应用堆内存为 128MB而高端设备12GB RAM可能允许 512MB 或更高。厂商定制不同厂商如小米、三星可能调整内存策略例如后台应用限制更严格。(2) 系统版本Android 8.0引入内存分级low-memory、mid-memory、high-memory动态调整应用限制。Android 11强化后台应用内存限制优先保障前台应用。(3) 进程类型前台进程优先级最高可占用更多内存。后台进程可能被严格限制如压缩或回收。其他内存区域除了 Java 堆内存应用还可使用以下内存但受系统总 RAM 限制Native 堆C/C 分配通过NDK分配的内存不受 Java 堆限制但过量使用仍会触发 OOM。显存GPU用于图形渲染由系统共享管理。内存映射文件如Bitmap可能直接映射到 Native 内存。内存使用状态可通过以下命令检测当前 App 的内存使用状态adb shell dumpsys meminfopackage_name以下命令可查询当前设备上单个应用可分配的最大内存限制主要是 Java 堆内存# Mac shelladb shell getprop|grepdalvik.vm.heapgrowthlimit# Windows shelladb shell getprop|findstr dalvik.vm.heapgrowthlimit# Mac shelladb shell getprop|grepdalvik.vm.heapsize# Windows shelladb shell getprop|findstr dalvik.vm.heapsizedalvik.vm.heapgrowthlimit普通应用的默认最大堆内存单位 KB。dalvik.vm.heapsize启用android:largeHeaptrue时的更大堆内存限制。开发者建议优化内存使用使用LeakCanary等工具主动检测内存泄漏。对大对象如Bitmap采用缓存策略或采样压缩避免一次性加载过大的图片。适配多设备务必在低内存设备如 2GB RAM 手机上进行测试确保 App 在资源受限环境下也能稳定运行。实现onTrimMemory()回调及时响应系统的内存警告主动释放非必要资源。谨慎使用largeHeap仅在确实需要大量内存的场景如大型图像处理应用中启用android:largeHeaptrue否则可能影响系统整体性能甚至影响应用商店的审核。总结典型值现代设备上普通应用的 Java 堆内存限制通常为 192MB~512MB。动态调整实际内存上限由设备硬件、系统版本和厂商策略共同决定并非固定不变。监控工具优先使用Android Profiler和adb shell dumpsys meminfo来分析和监控应用的内存使用情况。2.内存分配 DemoclassMemoryDemoActivity:AppCompatActivity(){privatelateinitvarbinding:ActivityMemoryDemoBindingprivatevarclickCount0privatevalmemoryHoldersmutableListOfByteArray()overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)enableEdgeToEdge()bindingActivityMemoryDemoBinding.inflate(layoutInflater)setContentView(binding.root)ViewCompat.setOnApplyWindowInsetsListener(binding.main){v,insets-valsystemBarsinsets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom)insets}setupClickListener()updateMemoryInfo()}privatefunsetupClickListener(){binding.btnAllocateMemory.setOnClickListener{allocateMemory()clickCountupdateMemoryInfo()}}privatefunallocateMemory(){// 每次分配50MB的内存valmemoryChunkByteArray(10*1024*1024)memoryHolders.add(memoryChunk)binding.tvMaxMemory.setTextColor(getColor(android.R.color.black))}privatefunupdateMemoryInfo(){valruntimeRuntime.getRuntime()valmaxMemoryruntime.maxMemory()/(1024*1024)valusedHeapMemory(runtime.totalMemory()-runtime.freeMemory())/(1024*1024)valnativeMemoryDebug.getNativeHeapAllocatedSize()/(1024*1024)binding.tvMaxMemory.text最大可用内存${maxMemory}MBbinding.tvHeapMemory.textJava堆内存使用${usedHeapMemory}MBbinding.tvNativeMemory.textNative内存使用${nativeMemory}MB}}?xml version1.0 encodingutf-8?LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalandroid:gravitycenter_horizontaltools:context.demo.memory.MemoryDemoActivityButtonandroid:idid/btnAllocateMemoryandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop32dpandroid:text分配内存/TextViewandroid:idid/tvMaxMemoryandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop32dpandroid:textSize16sptools:text最大可用内存1024MB/TextViewandroid:idid/tvHeapMemoryandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop16dpandroid:textSize16sptools:textJava堆内存使用512MB/TextViewandroid:idid/tvNativeMemoryandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop16dpandroid:textSize16sptools:textNative内存使用256MB//LinearLayout✨✨✨