[英]Why do some lines in my GC log show only one value for the heap size?
我的GC日志中的大多数行看起来像这样:
203.558:[GC 326391K-> 324672K(4192192K),0.0452610秒]
括号中的大小是“提交堆”,或(大约)操作系统看到的进程大小。 之前的两个数字(“a-> b”)显示GC之前和之后的堆使用情况。
现在,经常,我得到这样的行:
42381.926:[GC 10996274K(12565888K),0.0651560秒]
那些意味着GC没有改变堆使用情况,还是这是一个不同的消息? 我查看了Oracle的GC调优教程和另一个专门关于GC输出的页面 ,但是找不到这种类型的消息。
我正在使用Sun JVM(1.6.0.25),Concurrent Collector( -XX:+UseConcMarkSweepGC
),唯一与输出相关的启动选项是-Xloggc:gc.log
。
我在JDK 1.6更新23的源代码中搜索了“secs”(我可以找到它的最新1.6版本),并通过GC代码文件夹搜索正则表达式“[^”] * - > [^“] *”希望找到一个领先者。 我还搜索了OpenJDK 1.7代码。 然后我尝试在整个HotSpot文件夹中搜索“[^”] * - > [^“] *”?。* secs。 然而,我发现的唯一GC记录线似乎与你所看到的有很大关系
gclog_or_tty->print("[%s-concurrent-%s: %3.3f/%3.3f secs]",
_collector->cmsGen()->short_name(),
_phase, _collector->timerValue(), _wallclock.seconds());
这是在concurrentMarkSweepGeneration.cpp中。 它看起来与您看到的格式不太接近。 要么我没有很好地搜索,要么在更新23和更新25之间有关GC记录的更改。
如果有人更清楚地知道在哪里寻找或搜索什么,我将很乐意接受。
编辑:等待,发现从concurrentMarkSweepGeneration.cpp的第827行开始:
void ConcurrentMarkSweepGeneration::printOccupancy(const char *s) {
GenCollectedHeap* gch = GenCollectedHeap::heap();
if (PrintGCDetails) {
if (Verbose) {
gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"("SIZE_FORMAT")]",
level(), short_name(), s, used(), capacity());
} else {
gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"K("SIZE_FORMAT"K)]",
level(), short_name(), s, used() / K, capacity() / K);
}
}
if (Verbose) {
gclog_or_tty->print(" "SIZE_FORMAT"("SIZE_FORMAT")",
gch->used(), gch->capacity());
} else {
gclog_or_tty->print(" "SIZE_FORMAT"K("SIZE_FORMAT"K)",
gch->used() / K, gch->capacity() / K);
}
}
而这个函数只在这里调用:
void CMSCollector::do_CMS_operation(CMS_op_type op) {
gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
TraceTime t("GC", PrintGC, !PrintGCDetails, gclog_or_tty);
TraceCollectorStats tcs(counters());
switch (op) {
case CMS_op_checkpointRootsInitial: {
checkpointRootsInitial(true); // asynch
if (PrintGC) {
_cmsGen->printOccupancy("initial-mark");
}
break;
}
case CMS_op_checkpointRootsFinal: {
checkpointRootsFinal(true, // asynch
false, // !clear_all_soft_refs
false); // !init_mark_was_synchronous
if (PrintGC) {
_cmsGen->printOccupancy("remark");
}
break;
}
default:
fatal("No such CMS_op");
}
}
它确实看起来像你得到的。 我不太擅长解释这段代码,但我会说你所看到的只是一条日志行,显示当前堆使用后跟括号中的已提交堆大小,仅此而已。 基本相同的信息,但垃圾收集前没有使用。
你能列出所有gc-looging相关的jvm参数吗?
看看你的输出我觉得你没用
-verbose:gc -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails
还请检查
我认为这一行是由TraceTime
中的TraceTime启动的,它是从CMS( concurrentMarkSweepGeneration.cpp do_CMS_operation
)和ParNew( parNewGeneration.cpp collect
) parNewGeneration.cpp collect
。 这段代码似乎是源代码
void ConcurrentMarkSweepGeneration::printOccupancy(const char *s) {
GenCollectedHeap* gch = GenCollectedHeap::heap();
if (PrintGCDetails) {
if (Verbose) {
gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"("SIZE_FORMAT")]",
level(), short_name(), s, used(), capacity());
} else {
gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"K("SIZE_FORMAT"K)]",
level(), short_name(), s, used() / K, capacity() / K);
}
}
if (Verbose) {
gclog_or_tty->print(" "SIZE_FORMAT"("SIZE_FORMAT")",
gch->used(), gch->capacity());
} else {
gclog_or_tty->print(" "SIZE_FORMAT"K("SIZE_FORMAT"K)",
gch->used() / K, gch->capacity() / K);
}
}
因此,这是堆的总占用率(所有代的总和)以及当前GC操作期间经过的时间的陈述。 打印时间似乎是作为计时器( os::elapsed_counter
因此这是linux上的gettimeofday
)的TraceTime
当TraceTime
被实例化并在销毁时停止/打印时启动。
我建议您添加verbose:gc
以获取更多信息(如果需要)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.