2

前述のように、dalvik 仮想マシンで GC 固有のログを有効にしようとしています。これどうやってするの ?

GC 固有のログと言うとき、GC で発生するすべての関数呼び出しを監視したい (GC_EXPLIIT と GC_CONCURRENT と GC_FOR_ALLOC のみをもたらす logcat の gc フィッターだけでなく) フロー チャートを作成できるようにする (どのプロセスが GC と呼ばれるアルゴか) gc はヒューリスティックなどに基づいて呼び出されます)。

使ってみたadb shell dalvikvm [options] .

Dalvik 仮想マシンに -XX:+PrintGCDetails(of jvm) のようなオプションはありますか?

Androidフレームワークのコードベースにフラグはありますか?設定すると常にgcログが出力されますか?

dalvikvm の次のオプションは何をしますか? (良いオンライン参照がうまくいくでしょう)

-Xgc:[no]precise -Xgc:[no]preverify -Xgc:[no]postverify -Xgc:[no]concurrent -Xgc:[no]verifycardtable -XX:+DisableExplicitGC .

4

1 に答える 1

1

これらのオプションの詳細なドキュメントが見つかりません。

ソースコードを確認した後、これらのオプションは次のとおりです。

  • 正確: VM スレッド スタックの各項目は、整数または内部値またはオブジェクト ポインターのみの場合があります。これらの情報を登録するために、アイテムのステータスをマークするためのスタック スレッドのレジスタ マップがあります。開いている場合は、オブジェクトのみがマークされます。これは、精密/無注意 GC と呼ばれます。
  • xxx-verify: vm GC 検証ステップ用
  • 並行: GC 並行マークスイープ ステップを開く/閉じる
  • ExplicitGC: Java API Runtime.gc() またはシグナル GC を開く/閉じる。

詳細は次のとおりです。

dalvik ソース コードでは、これらのオプションを使用して dalvikvm GC を構成します。

} else if (strncmp(argv[i], "-Xgc:", 5) == 0) {
    //In VM thread, there is a register map for marking each stack item's status whether it is an object or internal value. And In GC step, only object item will be marked. If this value is OFF, all stack will be marked even if the item is only an integer.
    if (strcmp(argv[i] + 5, "precise") == 0)
        gDvm.preciseGc = true;
    else if (strcmp(argv[i] + 5, "noprecise") == 0)
        gDvm.preciseGc = false;
    //Only for GC verify check
    else if (strcmp(argv[i] + 5, "preverify") == 0)
        gDvm.preVerify = true;
    else if (strcmp(argv[i] + 5, "nopreverify") == 0)
        gDvm.preVerify = false;
    else if (strcmp(argv[i] + 5, "postverify") == 0)
        gDvm.postVerify = true;
    else if (strcmp(argv[i] + 5, "nopostverify") == 0)
        gDvm.postVerify = false;
    //Open/Close Dalvik vm GC markseep is concurrent or not
    else if (strcmp(argv[i] + 5, "concurrent") == 0)
        gDvm.concurrentMarkSweep = true;
    else if (strcmp(argv[i] + 5, "noconcurrent") == 0)
        gDvm.concurrentMarkSweep = false;
    //Only for GC verify cardtable which is used for marking the concurrent marksweep dirty field
    else if (strcmp(argv[i] + 5, "verifycardtable") == 0)
        gDvm.verifyCardTable = true;
    else if (strcmp(argv[i] + 5, "noverifycardtable") == 0)
        gDvm.verifyCardTable = false; 
    else {
        dvmFprintf(stderr, "Bad value for -Xgc");
        return -1;
    }
    ALOGV("Precise GC configured %s", gDvm.preciseGc ? "ON" : "OFF");
}

PS:

Android dalvikvm コマンド オプションを取得するには、コマンドadb shell dalvikvm -hを入力して詳細情報を取得できます。

そしてAndroid 4.3(yakju-user 4.3 JWR66Y 776638 release-keys)での結果は

dalvikvm: [options] class [argument ...]
dalvikvm: [options] -jar file.jar [argument ...]

The following standard options are recognized:
  -classpath classpath
  -Dproperty=value
  -verbose:tag  ('gc', 'jni', or 'class')
  -ea[:<package name>... |:<class name>]
  -da[:<package name>... |:<class name>]
   (-enableassertions, -disableassertions)
  -esa
  -dsa
   (-enablesystemassertions, -disablesystemassertions)
  -showversion
  -help

The following extended options are recognized:
  -Xrunjdwp:<options>
  -Xbootclasspath:bootclasspath
  -Xcheck:tag  (e.g. 'jni')
  -XmsN  (min heap, must be multiple of 1K, >= 1MB)
  -XmxN  (max heap, must be multiple of 1K, >= 2MB)
  -XssN  (stack size, >= 1KB, <= 256KB)
  -Xverify:{none,remote,all}
  -Xrs
  -Xint  (extended to accept ':portable', ':fast' and ':jit')

These are unique to Dalvik:
  -Xzygote
  -Xdexopt:{none,verified,all,full}
  -Xnoquithandler
  -Xjnigreflimit:N  (must be multiple of 100, >= 200)
  -Xjniopts:{warnonly,forcecopy}
  -Xjnitrace:substring (eg NativeClass or nativeMethod)
  -Xstacktracefile:<filename>
  -Xgc:[no]precise
  -Xgc:[no]preverify
  -Xgc:[no]postverify
  -Xgc:[no]concurrent
  -Xgc:[no]verifycardtable
  -XX:+DisableExplicitGC
  -X[no]genregmap
  -Xverifyopt:[no]checkmon
  -Xcheckdexsum
  -Xincludeselectedop
  -Xjitop:hexopvalue[-endvalue][,hexopvalue[-endvalue]]*
  -Xincludeselectedmethod
  -Xjitthreshold:decimalvalue
  -Xjitblocking
  -Xjitmethod:signature[,signature]* (eg Ljava/lang/String\;replace)
  -Xjitclass:classname[,classname]*
  -Xjitoffset:offset[,offset]
  -Xjitconfig:filename
  -Xjitcheckcg
  -Xjitverbose
  -Xjitprofile
  -Xjitdisableopt
  -Xjitsuspendpoll

Configured with: debugger profiler hprof jit(armv7-a-neon) smp show_exception=1 
于 2014-04-06T02:02:29.000 に答える