【问题标题】:Does jmap force garbage collection when the live option is used?使用 live 选项时 jmap 是否强制进行垃圾收集?
【发布时间】:2011-06-20 22:00:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: java garbage-collection jmap


    【解决方案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) :`
    

    【讨论】:

    • 我没能快速找到资源,你有吗?
    • 我可以查看源代码本身,但 java 确定 liveness 的唯一方法是运行完整的 GC。
    • 将其编辑为答案本身。
    • java 执行年轻 GC 的方式是“简单的”:我们有一个记忆集,其中包含指向年轻 GC 的旧对象的所有指针(并且有一些机制来捕获对旧对象的更改)。这意味着如果你只运行一个年轻的 GC,你只是假设记忆集中的每个对象都还活着。因此,即使指向它的唯一指针来自已死的旧对象,您也不会破坏年轻对象。仅出于这个原因,即使您只对年轻堆的活跃度感兴趣,您也需要完整的 GC。
    • “类似于-histo 选项,live 子选项是可选的,它指定只应转储活动对象。”来自java.sun.com/developer/technicalArticles/J2SE/monitoring;同意,这并不是直接告诉我们 GC 运行,但如前所述,它可能是唯一(也是最方便)的方式。
    猜你喜欢
    • 2012-12-06
    • 2015-02-12
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2016-05-19
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多