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