如何使用adb工具调用GC?

问题描述 投票:3回答:5

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

android debugging garbage-collection dalvik
5个回答
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
投票

杀-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!");
    }
}

0
投票

DDMS中原因GC的定义是: -

在“堆”选项卡中,单击“原因GC”以调用垃圾收集,从而启用堆数据的收集。操作完成后,您将看到一组对象类型以及为每种类型分配的内存。您可以再次单击“原因GC”以刷新数据。

这称为GC_EXPLICIT

使用Debug.dumpHprofData(String)生成堆转储。

将“hprof”数据转储到指定的文件。这可能会导致GC。


0
投票
adb shell am dumpheap com.test.test /sdcard/test.hprof

0
投票

我有同样的情况,其中我需要确保在查找活动的内存泄漏之前执行GC。我没有得到可以调用GC的直接解决方案或任何adb命令。

以下解决方法为我工作。

我在我正在调试的应用程序中注册了一个带有自定义Action的简单广播接收器。在onReceive方法里面我写了System.gc()方法。然后用简单的adb命令adb shell am broadcast -a INTENT_ACTION_NAME_HERE广播一个意图。

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


0
投票

从android studio,您可以使用Profiler工具。只需在探查器上添加您的应用程序会话,然后单击“内存”部分。然后按下标题上的强制GC按钮(用垃圾桶图标表示)

Profiler Force GC

© www.soinside.com 2019 - 2024. All rights reserved.