Android项目中内存溢出,故关注程序内存使用情况。
写了个打印内存使用情况的脚本:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class CdMemoryReader {
BufferedWriter writer;
/**
*
* @Description: TODO
* @param @param args args[0] : process name args[1]: execute time (int)
* args[2]: sleep time (long)
* @return void
* @throws @param args
* @date:2010/06/19 author:
*/
public static void main(String args[]) {
final String brower = "brower";
final String mms = "mms";
long sleeptime = 2000;
int times = 1000;
String procName = heco;
// CdMemoryReader cdMemoryReader = new CdMemoryReader() ;
System.out.println();
switch (args.length) {
default:
System.out.println("the args more than 3 is useless !");
System.out.println();
case 3:
try {
long sleepT = Long.parseLong(args[2]);
sleeptime = sleepT < 1000 ? 1000 : sleepT;
} catch (NumberFormatException e) {
System.out
.println("the args: " + args[2] + "is not a number .");
System.exit(0);
}
case 2:
try {
int exectime = Integer.parseInt(args[1]);
times = exectime <= 0 ? 1 : exectime;
} catch (NumberFormatException e) {
System.out
.println("the args: " + args[1] + "is not a number .");
System.exit(0);
}
case 1:
String name = args[0];
// 这里可以不做判断 直接使用传入的参数 我们是特定打印
if (name.contains(brower)) {
procName = brower;
} else if (name.contains(mms)) {
procName = mms;
} else {
System.out.println("the process name is wrong !!");
System.exit(0);
}
case 0:
System.out.println("proce name: " + procName);
System.out.println();
System.out.println("execute times: " + times);
System.out.println();
System.out.println("sleep time: " + sleeptime);
System.out.println();
new CdMemoryReader().cdAccess(sleeptime, times, 20, procName);
break;
}
}
private void cdAccess(long time, int times, int lines, String procName) {
Runtime rt = Runtime.getRuntime();
StringBuffer buffer = new StringBuffer();
String title = " PID Vss Rss Pss Uss cmdline";
System.out.println(title);
try {
writer = new BufferedWriter(new FileWriter(new File("D:/log.txt")));
writer.write(title + "/n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int printTime = 1;
for (int i = 0; i < times; i++) {
try {
String cmd = "adb shell procrank";
buffer.delete(0, buffer.length());
Process proc = rt.exec(cmd);
InputStream stderr = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
int j = 0;
while ((line = br.readLine()) != null) {
if (j < lines) {
if (line.contains(procName)) {
System.out.println(line + " PrintTime : "
+ printTime++ + " execute time : "
+ (i + 1));
buffer.append(line + "/n");
break;
}
}
j++;
}
// buffer.append("/n");
// buffer.append("/n");
writer.write(buffer.toString());
writer.flush();
// System.out.println("buffer.toString()" + buffer.toString());
} catch (Throwable t) {
t.printStackTrace();
}
try {
Thread.sleep(time);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
日志文件默认放在D盘。
将uss的数据获取放在excel中可以生成以下的图,更直观些。