3

jmap -histo:live は、生きているオブジェクトを決定するために完全な gc をトリガーすることがわかっています。

liveオプションが使用されている場合、jmapはガベージコレクションを強制しますか?

jmap -histo はヒープ内のすべてのオブジェクト (若い世代と古い世代のオブジェクト) を考慮するため、私の要点は、jmap -histo は完全な gc もトリガーできるということです。ただし、 jmap -histo が完全な gc をトリガーするかどうかについての確かなドキュメントに遭遇できませんでした。

jmap -histo は完全なガベージ コレクションをトリガーできますか?

4

4 に答える 4

8

jmap -histo完全なGCをトリガーし ませjmap -histo:liveが、トリガーします。

于 2017-02-24T02:58:30.607 に答える
6

JDK の経験が豊富な人がこれを確認する必要がありますが、少なくともOpenJDK 1.7では完全な GC がトリガーされると確信しています。から始めjdk/src/share/classes/sun/tools/jmap/JMap.javaます:

public class JMap {
    ...
    private static String LIVE_HISTO_OPTION = "-histo:live";
    ...        
    ...
      } else if (option.equals(LIVE_HISTO_OPTION)) {
            histo(pid, true);
    ...
    private static final String LIVE_OBJECTS_OPTION = "-live";
    private static final String ALL_OBJECTS_OPTION = "-all";
    private static void histo(String pid, boolean live) throws IOException {
        VirtualMachine vm = attach(pid);
        InputStream in = ((HotSpotVirtualMachine)vm).
            heapHisto(live ? LIVE_OBJECTS_OPTION : ALL_OBJECTS_OPTION);
        drain(vm, in);
    }

三項演算子 inは、次の引数Jmap.histo()を使用して heapHisto in を呼び出します。jdk/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java-live

// Heap histogram (heap inspection in HotSpot)
public InputStream heapHisto(Object ... args) throws IOException {
    return executeCommand("inspectheap", args);
}

そして、inspectheapそれ自体を見ると、次のようになりhotspot/src/share/vm/services/attachListener.cppます。

// Implementation of "inspectheap" command
//
// Input arguments :-
//   arg0: "-live" or "-all"
static jint heap_inspection(AttachOperation* op, outputStream* out) {
  bool live_objects_only = true;   // default is true to retain the behavior before this change is made
  const char* arg0 = op->arg(0);
  if (arg0 != NULL && (strlen(arg0) > 0)) {
    if (strcmp(arg0, "-all") != 0 && strcmp(arg0, "-live") != 0) {
      out->print_cr("Invalid argument to inspectheap operation: %s", arg0);
      return JNI_ERR;
    }
    live_objects_only = strcmp(arg0, "-live") == 0;
  }
  VM_GC_HeapInspection heapop(out, live_objects_only /* request full gc */, true /* need_prologue */);
  VMThread::execute(&heapop);
  return JNI_OK;
}

特に、live_objects_onlystrcmp とその結果のheapop呼び出しが 2 行後にあることに注意してください。inspectheap任意の方法で引数を取得すると-live、完全な gc が要求されます。

于 2013-04-01T17:06:55.977 に答える
1

いいえ、jmap -histoFullGC をトリガーしません。ヒストグラムを定期的に出力していますが、GC ログにフル GC が表示されません。

VM にどのように実装されているかはわかりませんが、フル GC について心配する必要はありません。

于 2013-01-05T06:09:24.707 に答える