我想测试Android应用程序'内存性能,我想自动获取内存信息。我使用' adb shell dumpsys meminfo ...'定期获取内存信息。 现在,我想观察内存泄漏,我该如何执行gc?就像"原因GC"在DDMS中。 谢谢!
答案 0 :(得分:4)
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()
是调用此方法的常规方便方法。
答案 1 :(得分:1)
杀-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!");
}
}
答案 2 :(得分:1)
答案 3 :(得分:0)
DDMS中原因GC的定义是: -
在“堆”选项卡中,单击“原因GC”以调用垃圾收集 启用堆数据的收集。操作完成后,您 将看到一组对象类型和已经存在的内存 为每种类型分配。您可以再次单击“原因GC”以刷新 数据
这称为GC_EXPLICIT
使用Debug.dumpHprofData(String)生成堆转储。
将“hprof”数据转储到指定文件。这可能会导致GC。
答案 4 :(得分:0)
adb shell am dumpheap com.test.test /sdcard/test.hprof
答案 5 :(得分:0)
我也有同样的情况,在寻找Activity的内存泄漏之前,我需要确保已执行GC。我没有直接解决方案,也没有任何可以调用GC的adb命令。
以下解决方法对我有用。
我在正在调试的应用程序中用自定义Action注册了一个简单的广播接收器。在onReceive
方法内部,我编写了System.gc()
方法。然后使用简单的adb命令adb shell am broadcast -a INTENT_ACTION_NAME_HERE
广播意图。
我知道现在已经很晚了,仍然有人会觉得这很有用。