Does jmap force garbage collection when the live option is used?(使用 live 选项时,jmap 是否强制进行垃圾收集?)
问题描述
我今天一直在试验 jmap -histo
和 jmap -dump
I've been experimenting with jmap -histo
and jmap -dump
today
按此顺序运行时
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
中不存在.
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
.
看到这一点,我开始寻找能够告诉我应该期待什么的文档.我设法得到的最接近的是 this discussion,briand 和 alanb 的评论在实践中暗示了这一点当我使用 live 选项时,我可以预期会发生此 GC;但答案是五年前的事了,论坛上的帖子似乎有点非正式的规范.
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.
在哪里可以找到记录的当前行为?
Where can I find the current behavior documented?
推荐答案
为了确定 liveness,Java 必须运行 full GC,所以是的,它确实如此.
In order to determine liveness, Java has to run full GC, so yes, it does.
为了让问题沉睡......如果有人需要更深入地挖掘,这就是答案.随意.
To put the question to sleep... here is the answer, if anyone needs to dig deeper. Feel free.
/hotspot/agent/src/share/vm/services/attachListener.cpp的一部分取自
openjdk http://download.java.net/openjdk/jdk7/并且您必须接受 http://www.gnu.org/licenses/gpl-2.0.html
openjdk http://download.java.net/openjdk/jdk7/ and you must accept 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) :`
这篇关于使用 live 选项时,jmap 是否强制进行垃圾收集?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 live 选项时,jmap 是否强制进行垃圾收集?


- Jersey REST 客户端:发布多部分数据 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01