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) :`