java 使用 live 选项时,jmap 是否强制垃圾回收?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6418089/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Does jmap force garbage collection when the live option is used?
提问by VoiceOfUnreason
I've been experimenting with jmap -histo
and jmap -dump
today
我一直在试验jmap -histo
和jmap -dump
今天
When run in this sequence
按此顺序运行时
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
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
.
heap.3
类似heap.2
不止heap.1
。特别是,我感兴趣的“死”对象heap.1
不在heap.3
.
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.
看到这一点,我开始寻找可以告诉我应该期待什么的文档。我设法得到的最接近的是这个讨论,其中来自 briand 和 alanb 的评论暗示在实践中,当我使用 live 选项时,我可以期望这个 GC 发生;但是答案已经五年了,论坛上的帖子对于规范来说似乎有点非正式。
Where can I find the current behavior documented?
在哪里可以找到记录在案的当前行为?
回答by bestsss
In order to determine liveness, Java has torun full GC, so yes, it does.
为了确定活跃度,Java必须运行 full GC,所以是的,它确实如此。
To put the question to sleep... here is the answer, if anyone needs to dig deeper. Feel free.
让这个问题入睡......这是答案,如果有人需要深入挖掘。随意。
part of /hotspot/agent/src/share/vm/services/attachListener.cpptaken from
/hotspot/agent/src/share/vm/services/attachListener.cpp 的一部分取自
openjdk http://download.java.net/openjdk/jdk7/and you must accept http://www.gnu.org/licenses/gpl-2.0.html
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;
}
in vmGCOperations.hpp it's the definition
在 vmGCOperations.hpp 它是定义
`VM_GC_HeapInspection(outputStream* out, bool request_full_gc,
bool need_prologue) :`