如何使用adb工具调用GC?

时间:2014-08-20 03:28:02

标签: android debugging garbage-collection dalvik

我想测试Android应用程序'内存性能,我想自动获取内存信息。我使用' adb shell dumpsys meminfo ...'定期获取内存信息。 现在,我想观察内存泄漏,我该如何执行gc?就像"原因GC"在DDMS中。 谢谢!

6 个答案:

答案 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

从:https://github.com/TencentOpen/GT/blob/master/android/src/com/tencent/wstt/gt/proInfo/floatView/GTMemHelperFloatview.java

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)

在android studio中,您可以使用Profiler工具。 只需在分析器上添加您的应用会话,然后单击“内存”部分。然后按标题上的“强制GC”按钮(已显示“垃圾箱”图标)

Profiler Force GC

答案 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广播意图。

我知道现在已经很晚了,仍然有人会觉得这很有用。