使用 live 选项时,jmap 是否会强制垃圾回收?

2022-09-01 07:44:44

我一直在尝试,今天jmap -histojmap -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.2heap.1heap.1heap.3

看到这一点,我开始寻找可以告诉我应该期待什么的文档。我设法得到的最接近的是这个讨论,其中来自briand和alanb的评论暗示,在实践中,当我使用实时选项时,我可以期望这个GC发生;但是答案是五年前的,对于一个规范来说,论坛上的帖子似乎有点非正式。

在哪里可以找到记录的当前行为?


答案 1

为了确定活动性,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) :`

答案 2