当查找应用内存泄露的原因时,有2种可能性很大的原因:
1、线程没有及时关闭,导致线程一直运行,间接导致 Activity 泄露;
2、Activity 泄露,可能把 Activity 的引用保存到声明周期长的容器里,比如 static 容器,或 Application 里。
查看 Activity 泄露,使用 dumpsys meminfo 包名,来回打开关闭可疑的activity,查看 activities的数量是不一直增加,而且只增加,不减少。
查看 线程问题,使用: ps | grep 应用包名或包名关键字,找到应用的进程pid,
然后,使用: ps -t 进程pid, 查看进程里的线程情况,来回打开关闭可疑的activity,
过一会执行一下:ps -t 进程pid, 对比查看启动的线程数量是不是在一直增加,而且只增加不减少,出现这种情况就是线程没有关闭。
注意:为了容易发现问题,启动线程时最好给线程设置一个有意义的名字。
ps -t 进程pid 命令,就不用再启动Eclipse 的 DDMS了。之前是在 DDMS 里查看应用的线程情况的。
假如查询进程pid是123内的线程
ps -t 123
假如查询进程pid是123内的线程,且含有关键字 key 的线程
ps -t 123 | grep key
*********************************
android 9 的命令与上面写的不一样:
ps --help
查询 ps 的帮助信息;
Which processes to show (selections may be comma separated lists):
-A All processes
-a Processes with terminals that aren't session leaders
-d All processes that aren't session leaders
-e Same as -A
-g Belonging to GROUPs
-G Belonging to real GROUPs (before sgid)
-p PIDs (--pid)
-P Parent PIDs (--ppid)
-s In session IDs
-t Attached to selected TTYs
-T Show threads
-u Owned by USERs
-U Owned by real USERs (before suid)
ps -A
显示全部进程信息
ps -A | grep 应用包名或包名关键字,找到应用的进程pid,
ps -T 123
查看进程 pid 是123的进程内的线程信息
top --help
查看top命令的帮助;
Show process activity in real time.
-H Show threads
-k Fallback sort FIELDS (default -S,-%CPU,-ETIME,-PID)
-o Show FIELDS (def PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,CMDLINE)
-O Add FIELDS (replacing PR,NI,VIRT,RES,SHR,S from default)
-s Sort by field number (1-X, default 9)
-b Batch mode (no tty)
-d Delay SECONDS between each cycle (default 3)
-m Maximum number of tasks to show
-n Exit after NUMBER iterations
-p Show these PIDs
-u Show these USERs
-q Quiet (no header lines)
top -H -p 123
查看 进程pid 为 123 的进程内的线程CPU消耗情况;
查看进程号pid为 123 的进程内的线程CPU消耗情况,最多显示10条信息:
top -H -p 123 -m 10