Java内存管理及内存泄漏分析总结

本文详细探讨了Android内存管理模型,包括进程类型、内存信息的查看方法、ART虚拟机内存管理以及Java堆和Native堆的区别。此外,还介绍了如何分析内存泄露,通过MAT工具和adb命令进行内存分析,揭示了可能导致内存泄露的原因,例如ViewGroup中未移除的Child View和Fragment的不当管理。最后,通过具体案例展示了内存泄露问题的排查和解决过程。
摘要由CSDN通过智能技术生成

Android内存管理模型

Android中的进程

(1)   native进程:采用C/C++实现,不包含dalvik实例的linux进程,/system/bin/目录下面的程序文件运行后都是以native进程形式存在的。如图           3,/system/bin/surfaceflinger、/system/bin/rild、procrank等就是native进程。

(2)   java进程:实例化了dalvik虚拟机实例的linux进程,进程的入口main函数为java函数。dalvik虚拟机实例的宿主进程是fork()系统调用创建的linux进程,所以每一个android上的java进程实际上就是一个linux进程,只是进程中多了一个dalvik虚拟机实例。因此,java进程的内存分配比native进程复杂。如图3,Android系统中的应用程序基本都是java进程,如桌面、电话、联系人、状态栏等等。

使用Linux命令打印某个进程的内存信息

一个Java进程对应一个虚拟机实例(也就是一个对象)。Dalvik heap指的是使用Java new关键字申请的空间,而使用malloc或者c++ new的空间属于native heap,而虚拟机的垃圾回收器指负责管理Dalvik heap。就是说native heap需要使用代码主动显式释放。

native process和java process的结构

在32位操作系统中,进程的地址空间为0到4GB

Java内存管理示意图:

Java进程最大的内存大小:

获取Dalvik初始分配的内存大小

查看/system/build.prop文件

 dalvik.vm.heapstartsize=8m
 dalvik.vm.heapgrowthlimit=192m
 dalvik.vm.heapsize=512m
  • dalvik.vm.heapstartsize=8m 相当于虚拟机的 -Xms配置,该项用来设置堆内存的初始大小。
  • dalvik.vm.heapgrowthlimit=192m 相当于虚拟机的 -XX:HeapGrowthLimit配置,该项用来设置一个标准的应用的最大堆内存大小。一个标准的应用就是没有使用android:largeHeap的应用。
  • dalvik.vm.heapsize=512m 相当于虚拟机的 -Xmx配置,该项设置了使用android:largeHeap的应用的最大堆内存大小。

如何查看RAM使用情况

可以使用adb shell cat /proc/meminfo查看RAM使用情况:

MemTotal:        396708 kB

MemFree:           4088 kB

Buffers:           5212 kB

Cached:          211164 kB

SwapCached:           0 kB

Active:          165984 kB

Inactive:        193084 kB

Active(anon):    145444 kB

Inactive(anon):     248 kB

Active(file):     20540 kB

Inactive(file):  192836 kB

Unevictable:       2716 kB

Mlocked:              0 kB

HighTotal:            0 kB

HighFree:             0 kB

LowTotal:        396708 kB

LowFree:           4088 kB

SwapTotal:            0 kB

SwapFree:             0 kB

Dirty:                0 kB

Writeback:            0 kB

AnonPages:       145424 kB

……

……

这里对其中的一些字段进行解释:

MemTotal:可用的总内存--总物理内存减去kernel 代码/数据段占用再减去保留的内存区

MemFree:完全未用到的物理内存 LowFree+HighFree

Cached:缓存(这个也是app可以申请到的内存)

HightTotal:RAM中地址高于860M的物理内存总和,只能被用户空间的程序使用。

HightFree:RAM中地址高于860M的未使用内存

LowTotal:RAM中内核和用户空间程序都可以使用的内存总和(对于512M的RAM: lowTotal= MemTotal)

LowFree: RAM中内核和用户空间程序未使用的内存(对于512M的RAM: lowFree =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值