Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当使用live选项时,jmap是否强制垃圾收集?_Java_Garbage Collection_Jmap - Fatal编程技术网

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

Java 当使用live选项时,jmap是否强制垃圾收集?,java,garbage-collection,jmap,Java,Garbage Collection,Jmap,我今天一直在试验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。特别是,我感兴趣的heap.1中的“死”对象在heap.3中不存在 看到这一点,我开始寻找可以告诉我应该期待什么的文档。我得到的最接近的

我今天一直在试验
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
。特别是,我感兴趣的
heap.1
中的“死”对象在
heap.3
中不存在

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


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

为了确定活跃度,Java必须运行完整的GC,所以是的,它运行完整的GC


让问题进入梦乡。。。如果有人需要深入挖掘,答案就在这里。放心吧

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

openjdk 您必须接受

在vmGCOperations.hpp中,它是


我无法快速找到源代码,你有吗?我可以查看源代码本身,但java确定活跃度的唯一方法是运行完整GC。将其编辑为答案本身。java执行年轻GC的方式是“简单的”:我们有一个记忆集,包含指向年轻GC的所有旧对象指针(并且有一些机制来捕获对旧对象的更改)。这意味着,如果只运行一个年轻的GC,您只需假设记忆集中的每个对象都仍然是活动的。因此,即使指向年轻对象的唯一指针来自一个死的旧对象,您也不会销毁它。仅出于这个原因,您需要一个完整的GC,即使您只关心年轻堆的活动性。“与
-histo
选项类似,
live
子选项是可选的,并指定只转储活动对象。”from;同意,这并不是直接告诉我们GC运行,但如前所述,这可能是唯一(也是最方便)的方式。
// 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;
}
`VM_GC_HeapInspection(outputStream* out, bool request_full_gc,
                   bool need_prologue) :`