当前位置: 首页 > 面试题库 >

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

黄啸
2023-03-14
问题内容

我一直在尝试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.2以上heap.1。特别是,我heap.1没有感兴趣的“死”对象heap.3

看到这一点,我开始寻找可以告诉我期望的文档。我最接近的讨论是该讨论,briand和alanb的评论暗示实际上,我可以期望使用live选项时会出现该GC。但答案已有5年之久了,在论坛上发帖似乎对规范不拘一格。

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


问题答案:

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


 类似资料:
  • 问题内容: 我很好奇嵌套函数的node.js模式如何与v8的垃圾收集器一起工作。这是一个简单的例子 如果restofprogram是长时间运行的,那是否不意味着str将永远不会被垃圾回收?我的理解是,使用结点,您最终会获得很多嵌套函数。如果在外部声明了restofprogram,是否会收集垃圾,因此str不能在范围内?这是推荐做法吗? 编辑 我不想使问题复杂化。那只是粗心,所以我修改了它。 问题答

  • 嗨,根据这里的留档https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/concurrent.html#mostly_concurrent热点JVM有两个并发收集器——CMS和G1。所以在垃圾回收机制中,这两个是并行使用的,还是只选择了一个?

  • 问题内容: 我有一个Java应用程序正在泄漏内存。我知道在垃圾回收期间哪些对象没有被释放,但是我无法确定引用它们的对象。 JVM内部保存的对象图是否具有某种可见性? 否则就有可能找出哪些对象引用了另一个对象? 问题答案: 在真正的基础上,您可以使用命令jhat和jmap从正在运行的Java进程中读取堆文件,然后对其进行处理- 它在本地端口上启动小型Web服务器。它并不是很容易阅读,但是您不必购买分

  • 问题内容: 即使很棘手,也可以在Java中强制进行垃圾回收吗?我知道;,;但是他们只建议做GC。我该如何强制GC? 问题答案: 最好的选择是调用,这只是向垃圾收集器提示你要它进行收集。由于垃圾收集器是不确定的,因此无法强制立即收集。

  • 问题内容: 给定仅在程序设置中使用的假设实用程序类: 不再使用myObject时会对其进行垃圾回收,还是在程序的生命周期内始终存在? 问题答案: 加载类时,不能选择静态变量进行垃圾回收。当各自的类加载器(负责加载此类)本身被收集为垃圾时,可以收集它们。 查看JLS第12.7节卸载类和接口 仅当垃圾回收器可以回收定义的类加载器时,才可以卸载类或接口。引导加载器加载的类和接口可以不卸载。

  • 问题内容: 我问这个问题是因为我正在创建很多执行程序服务,尽管我可能已经在某个地方进行内存泄漏了,需要进行调查,但是我认为对以下代码的最近更改实际上使它更糟,因此,我尝试确认到底是怎么回事: 然后,这会在(通常)N = 2个线程的另一个线程池上被调用,我不确定这是否相关。 问题是:一旦完成,是否超出范围 并 获取垃圾? 问题答案: ExecutorService服务是否超出范围并在完成后获得垃圾回