使用 live 选项时,jmap 是否强制进行垃圾收集?

2022-01-16 00:00:00 garbage-collection java jmap

我今天一直在试验 jmap -histojmap -dump

I've been experimenting with jmap -histo and jmap -dump today

按此顺序运行时

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.特别是,我对 heap.1 感兴趣的死"对象在 heap.3 中不存在.

heap.3 resembles heap.2 more than heap.1. In particular, the "dead" objects that I'm interested in in heap.1 are absent from heap.3.

看到这一点,我开始寻找能够告诉我应该期待什么的文档.我设法得到的最接近的是 this discussion,briand 和 alanb 的评论在实践中暗示了这一点当我使用 live 选项时,我可以预期会发生此 GC;但答案是五年前的事了,论坛上的帖子似乎有点非正式的规范.

Seeing this, I started looking for documentation that would tell me what I should expect. The closest I managed to get was this discussion, where the comments from briand and alanb imply that in practice I can expect this GC to occur when I use the live option; but the answers are five years old, and posts to a forum seem a bit informal for a specification.

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

Where can I find the current behavior documented?

推荐答案

为了确定 liveness,Java 必须运行 full GC,所以是的,它确实如此.

In order to determine liveness, Java has to run full GC, so yes, it does.

为了让问题沉睡......如果有人需要更深入地挖掘,这就是答案.随意.

To put the question to sleep... here is the answer, if anyone needs to dig deeper. Feel free.

/hotspot/agent/src/share/vm/services/attachListener.cpp的一部分取自

openjdk http://download.java.net/openjdk/jdk7/并且您必须接受 http://www.gnu.org/licenses/gpl-2.0.html

openjdk http://download.java.net/openjdk/jdk7/ and you must accept 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) :`

相关文章