android logcat 关于内存回收的字段解释

本文介绍了Dalvik虚拟机中的内存管理和垃圾回收机制。详细解释了不同类型的垃圾回收触发原因,如GC_MALLOC、GC_CONCURRENT等,并阐述了Java内存与Native内存的区别及管理方式。
内存调试 D/dalvikvm( 809 ): GC_CONCURRENT freed

如果在Linux下运行adb logcat命令,可以看到如下的输出:

 GC_EXTERNAL_ALLOC freed 297K, 49% free 3411K/6663K, external 24870K/26260K, paused 83ms

其中D/dalvikvm表示由dalvikvm输出的调试信息,括号后的数字代表dalvikvm所在进程的pid。 

GC_CONCURRENT表示触发垃圾收集的原因,有以下几种:


  • GC_MALLOC, 内存分配失败时触发
  • GC_CONCURRENT,当分配的对象大小超过384K时触发
  • GC_EXPLICIT,对垃圾收集的显式调用(System.gc)
  • GC_EXTERNAL_ALLOC,外部内存分配失败时触发


前面Free的内存是VM中java使用的内存,external是指VM中通过JNI中Native的类中的malloc分配出的内存例如Bitmap和一些Cursor都是这么分配的。
在Davilk中,给一个程序分配的内存根据机型厂商的不同,而不同,现在的大部分的是32M了,而在VM内部会把这些内存分成java使用的内存和 Native使用的内存,它们之间是不能共享的,就是说当你的Native内存用完了,现在Java又有空闲的内存,这时Native会重新像VM申请,而不是直接使用java的。

<think>好的,用户想知道如何用ADB检查Android设备是否处于低内存状态。首先,我需要回忆一下ADB相关的命令,特别是和内存相关的。之前提到的dumpsysmeminfo可能有用,但用户可能还需要更系统层面的信息。记得Android系统有内存压力状态,比如低内存或者内存不足的情况。系统可能会触发LMK(Low MemoryKiller)机制。这时候,可能需要查看系统日志或者使用特定的ADB命令来获取这些信息。用户提到的引用里,有使用adbshell dumpsysmeminfo<package_name>来查看应用内存分配,但用户的问题是关于整个设备的低内存状态,而不仅仅是单个应用。所以可能需要更全局的命令,比如adbshell dumpsysmeminfo或者adbshell procrank之类的,不过procrank可能需要root权限。另外,系统属性中的内存信息可能有用,比如查看/proc/meminfo文件,通过adbshell cat/proc/meminfo可以获取总内存、空闲内存等数据,从而判断是否低内存。比如MemTotal、MemFree、Cached等字段,计算可用内存。还有,用户可能想知道实时的内存状态,比如使用adb shelltop命令查看内存使用情况,或者使用adbshell dumpsysactivity processes来查看进程的内存状态,系统是否在频繁杀死进程,这可能表明低内存。 另外,Android的sysfs中可能有相关节点,比如/sys/module/lowmemorykiller/parameters/minfree,这个文件里的值表示不同内存阈值,当可用内存低于这些值时,LMK会开始杀死进程。用户可以通过查看这些阈值和当前可用内存来判断是否处于低内存状态。不过要注意,不同设备可能有不同的配置,特别是定制过的ROM。此外,ADB命令可能需要设备开启USB调试权限,并且有些命令可能需要root权限才能执行,比如procrank。总结一下,可能的步骤是:1.使用dumpsysmeminfo查看全局内存状态;2.检查/proc/meminfo的数据;3.查看LMK的阈值和当前内存情况;4.分析日志或进程状态。同时需要考虑权限问题和设备差异。 需要确保提供的命令正确,语法正确,比如adbshell dumpsysmeminfo的正确用法,以及如何解析输出结果。比如,在meminfo的输出中,是否有明确的指标表明低内存,比如Available内存是否低于某个阈值,或者是否有相关的日志信息。 另外,用户可能需要对比不同时间的内存数据来判断是否持续处于低内存状态,或者是否有内存泄漏等问题。所以可能需要建议用户定期收集数据进行分析。最后,生成相关问题的时候,要考虑用户可能的后续问题,比如如何优化内存,或者如何监控内存变化,或者具体的阈值判断标准。</think>### 如何检查Android设备的低内存状态 #### 方法1:通过`dumpsys meminfo`分析全局内存 1. **执行命令**: ```bash adb shell dumpsys meminfo ``` 2. **关键指标**: - **`Total RAM`**: 设备总内存 - **`Free RAM`**: 当前空闲内存 - **`Used RAM`**: 已使用内存 - **`Lost RAM`**: 系统无法回收的“丢失”内存(高值可能表示内存碎片化) 若`Free RAM`持续低于总内存的10%,可能处于低内存状态[^1]。 #### 方法2:查看`/proc/meminfo`详细数据 1. **执行命令**: ```bash adb shell cat /proc/meminfo ``` 2. **核心字段**: - **`MemTotal`**: 总内存 - **`MemFree`**: 未使用内存 - **`Cached`**: 缓存内存(可快速释放) - **`SwapTotal`** 和 **`SwapFree`**: 交换分区状态(若无交换分区,低内存风险更高) 计算可用内存公式: $$ \text{Available} = \text{MemFree} + \text{Cached} $$ 若`Available`接近`MemTotal`的5%,设备可能处于低内存[^3]。 #### 方法3:检查Low Memory Killer (LMK)阈值 1. **查看LMK触发阈值**: ```bash adb shell cat /sys/module/lowmemorykiller/parameters/minfree ``` 输出格式为逗号分隔值(如`18432,23040,27648,32256,36864,46080`),单位为KB,对应不同内存压力级别[^3]。 2. **对比当前内存**: 若`cat /proc/meminfo`中的`MemFree`低于LMK最小阈值,说明系统已开始清理进程。 #### 方法4:通过日志观察内存警告 1. **抓取内核日志**: ```bash adb shell dmesg | grep "low memory" ``` 2. **系统级警告**: Android会在`logcat`中输出`ActivityManager`的警告,例如: ```bash adb logcat | grep "Low on memory" ``` --- ### 内存状态判断标准 | 指标 | 安全范围 | 低内存风险 | |---------------------|-------------------|-------------------| | `Free RAM` | >总内存15% | <总内存5% | | `Available` | >总内存20% | <总内存10% | | `SwapFree`(如有) | >交换分区30% | <交换分区10% | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值