"垃圾收集日志"中的"GC--"是什么意思?

Rod*_*own 11 java logging garbage-collection

我们打开了详细的GC日志记录来跟踪已知的内存泄漏并在日志中获得以下条目:

...
3607872.687: [GC 471630K->390767K(462208K), 0.0325540 secs]
3607873.213: [GC-- 458095K->462181K(462208K), 0.2757790 secs]
3607873.488: [Full GC 462181K->382186K(462208K), 1.5346420 secs]
...
Run Code Online (Sandbox Code Playgroud)

我理解第一个和第三个,但"GC--"是什么意思?

xor*_*aul 13

我的gc输出中有这些行:

44871.602: [GC-- [PSYoungGen: 342848K->342848K(345600K)] 961401K->1041877K(1044672K), 0.1018780 secs] [Times: user=0.16 sys=0.00, real=0.11 secs]
Run Code Online (Sandbox Code Playgroud)

我读了Yishai的答案,这是有意义的,但我想在Java GC源代码中看到它,当JVM在GC日志中打印" - "时为什么.

因为根据我的知识,Young Gen的"Parallel Scavenge"是一个停止世界的GC,因此不可能有任何与此GC 并行创建的对象.(参见https://blogs.oracle.com/jonthecollector/entry/our_collectors)

你可以在jdk源代码中找到它(参见http://hg.openjdk.java.net/jdk7/jdk7)g1CollectedHeap.cpp和psScavenge.cpp

jdk7-ee67ee3bd597/hotspot/src/share$ egrep -h -A2 -B5 -r '"\-\-"' *
# G1 Collector
if (evacuation_failed()) {
  remove_self_forwarding_pointers();
  if (PrintGCDetails) {
    gclog_or_tty->print(" (to-space overflow)");
  } else if (PrintGC) {
    gclog_or_tty->print("--");
  }
}
--
# Parallel Scavenge Collector
promotion_failure_occurred = promotion_failed();
if (promotion_failure_occurred) {
  clean_up_failed_promotion();
  if (PrintGC) {
    gclog_or_tty->print("--");
  }
}
Run Code Online (Sandbox Code Playgroud)

GC的原因 - 使用Parallel Scavenge Collector

Young GC遇到促销失败(请参阅http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2010-March/000567.html):

促销失败是一种没有成功的清除,因为老一代没有足够的空间来进行所有必要的促销活动.清除本质上是解开的,然后完成整个堆的STW压缩.

"没有足够的空间"并不一定意味着旧的空间不足,但旧的空间非常分散(参见http://blog.ragozin.info/2011/10/java-cg-hotspots- cms-and-heap.html):

[...]即使可用字节总数足够大,也无法找到一定量的连续内存来促进特定的大型对象.

这两个JVM选项可以帮助您分析堆碎片(请参阅http://blog.ragozin.info/2011/10/java-cg-hotspots-cms-and-heap.html):

-XX:+PrintPromotionFailure
-XX:PrintFLSStatistics=1
Run Code Online (Sandbox Code Playgroud)

使用G1收集器的GC的原因

G1的疏散失败是当幸存者区域没有足够的空间来存放来自Young Region的幸存物体时.

我不知道G1收集器是否用Full GC响应疏散失败.