1.生成可執行文件收集動態內存數據
\hardware\qcom\memory\memory_detect.c
#include <stdio.h>
#include <linux/kernel.h>
#include <linux/unistd.h>
#include <unistd.h>
#include <sys/sysinfo.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
FILE * mfd;
FILE * rfd;
char buff[1024];
long total;
long avalable;
long free;
float memory_ratio;
char name[20];
char sf[7];
int interval = 0;
if(argc > 1)
{
//char* 到 int
interval = (int)atoi(argv[1]);
printf("arg_num : %d,interval : %d\n",argc,interval);
}else{
//default 60s
interval = 60;
}
system("rm -rf /data/memory.txt");
rfd = fopen("/data/memory.txt","ab+");
sprintf(sf,"%d",interval);
fwrite(sf,1,1,rfd);
fclose(rfd);
while(1)
{
avalable = 0;
free = 0;
mfd = fopen("/proc/meminfo","r");
rfd = fopen("/data/memory.txt","ab+");
fgets(buff, sizeof(buff), mfd);
sscanf(buff, "%s %ld", name,&total);
fgets(buff, sizeof(buff), mfd);
sscanf(buff, "%s %ld", name,&free);
fgets(buff, sizeof(buff), mfd);
sscanf(buff, "%s %ld", name,&avalable);
printf("total : %ld,avalable : %ld\n",total,avalable);
memory_ratio = (float)avalable/(float)total;
sprintf(sf,"\n%.3f",memory_ratio); // float 到 char
printf("memory ratio:%s\n",sf);
fwrite(sf,1,sizeof(sf)-1,rfd);
fclose(mfd);
fclose(rfd);
sleep(interval);
}
}
Android.mk
LOCAL_PATH := $(call my-dir)
# common include paths
#
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(commonIncludes)
LOCAL_MODULE := memory_detect
LOCAL_MODULE_OWNER := qti
LOCAL_SRC_FILES := memory_detect.c
LOCAL_CFLAGS := -D_GNU_SOURCE
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS := optional
LOCAL_PROPRIETARY_MODULE := true
include $(BUILD_EXECUTABLE)
之後推送到目標機,執行memory_detect 10 &
後臺執行即可(每隔10s收集一次剩餘內存的比率)。待收集到足夠的數據後,取出內存數據/data/memory.txt
2.使用matplotlib繪製內存變化的趨勢圖,python的腳本memory.py如下:
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
y_values = []
file = open("memory.txt")
line = file.readline()
interval = int(line)
print interval
line = file.readline()
while line:
line = float(line)
print line
y_values.append(line)
line = file.readline()
x_values = []
for i in range(len(y_values)):
x_values.append(i*interval)
plt.scatter(x_values, y_values, s=40)
plt.title("memory usage tendency", fontsize=24)
plt.xlabel("times", fontsize=14)
plt.ylabel("memory usage ratio", fontsize=14)
plt.axis([0, len(x_values*interval), 0, 1.0])
plt.tick_params(axis='both', labelsize=14)
plt.show()
說明:memory_detect進程採集的第一個數據是每次數據收集的間隔時間(單位秒)
3.查看內存變化趨勢圖
從上圖中,能夠很清晰的看出每隔2s採集的內存數據,剩餘內存基本都維持在0.6左右