Jmap вызывает сборку мусора при использовании опции live? - PullRequest
29 голосов
/ 21 июня 2011

Я экспериментировал с jmap -histo и jmap -dump сегодня

При запуске в этой последовательности

jmap -dump:format=b,file=heap.1 [pid]
jmap -dump:live,format=b,file=heap.2 [pid]
jmap -dump:format=b,file=heap.3 [pid]

heap.3 напоминает heap.2 больше, чем heap.1.В частности, «1011» * интересующие меня «мертвые» объекты отсутствуют в heap.3.

Увидев это, я начал искать документацию, в которой говорилось бы, чего мне следует ожидать.Самое близкое, что мне удалось получить, это это обсуждение , где комментарии Бриана и Аланба подразумевают, что на практике я могу ожидать, что этот GC произойдет, когда я использую опцию live;но ответы уже пять лет, и посты на форуме кажутся немного неформальными для спецификации.

Где я могу найти документально подтвержденное текущее поведение?

1 Ответ

33 голосов
/ 31 октября 2011

Чтобы определить жизнеспособность, Java должен запустить полный GC, так что да, это так.


Чтобы уложить вопрос в сон ... вот ответЕсли кому-то нужно копать глубже.Не стесняйтесь.

часть /hotspot/agent/src/share/vm/services/attachListener.cpp взята из

openjdk http://download.java.net/openjdk/jdk7/ и вы должны принять http://www.gnu.org/licenses/gpl-2.0.html

// 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;
}

в vmGCOperations.hpp это определение

`VM_GC_HeapInspection(outputStream* out, bool request_full_gc,
                   bool need_prologue) :`
...