我想测试android应用程序的内存性能,我想自动获取内存信息。我使用'adb shell dumpsys meminfo ...'来定期获取内存信息。现在,我想观察内存泄漏,我该如何执行gc?就像DDMS中的“原因GC”一样。谢谢!
DDMS调试器通过套接字连接到Dalvik VM。响应“原因GC”命令,它发送一个“HPGC”数据包(即HeaP GC),最终在handleHPGC()
类的core/java/android/ddm/DdmHandleHeap.java
方法中。
handleHPGC()
方法只是调用java.lang.Runtime.getRuntime().gc()
方法。
我认为你可以使用Java调试线协议(JDWP)编写一个简单的(??? - 我从来没有这样做,所以它可能不是那么简单)程序将附加到应用程序的调试端口'使用该API重新测试并调用垃圾收集器。
作为Java docs say for java.lang.Runtime.gc()
:
System.gc()
方法是调用此方法的常规方便方法。
杀-10 pid
private void gc() {
String pid = String.valueOf(ProcessUtils
.getProcessPID(AUTManager.pkn.toString()));
if (!pid.equals("-1")) {
boolean isSucess = true;
ProcessBuilder pb = null;
String cmd = "kill -10 " + pid;
pb = new ProcessBuilder("su", "-c", cmd);
Process exec = null;
pb.redirectErrorStream(true);
try {
exec = pb.start();
InputStream is = exec.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
while ((reader.readLine()) != null) {
isSucess = false;
}
} catch (Exception e) {
e.printStackTrace();
isSucess = false;
}
// 至此命令算是执行成功
if (isSucess)
{
handler.sendEmptyMessage(5);
}
} else {
Log.d("gc error", "pid not found!");
}
}
DDMS中原因GC的定义是: -
在“堆”选项卡中,单击“原因GC”以调用垃圾收集,从而启用堆数据的收集。操作完成后,您将看到一组对象类型以及为每种类型分配的内存。您可以再次单击“原因GC”以刷新数据。
这称为GC_EXPLICIT
使用Debug.dumpHprofData(String)生成堆转储。
将“hprof”数据转储到指定的文件。这可能会导致GC。
adb shell am dumpheap com.test.test /sdcard/test.hprof
我有同样的情况,其中我需要确保在查找活动的内存泄漏之前执行GC。我没有得到可以调用GC的直接解决方案或任何adb命令。
以下解决方法为我工作。
我在我正在调试的应用程序中注册了一个带有自定义Action的简单广播接收器。在onReceive
方法里面我写了System.gc()
方法。然后用简单的adb命令adb shell am broadcast -a INTENT_ACTION_NAME_HERE
广播一个意图。
我知道现在已经很晚了,仍然有人会觉得这很有用。