当前位置: 首页 > 面试题库 >

Java垃圾回收日志中的“ GC--”是什么意思?

彭鹭洋
2023-03-14
问题内容

我们打开了详细的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]
...

我理解其中的第一个和第三个,但是“ GC–”是什么意思?


问题答案:

我在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]

我读了Yishai的回答,这很有意义,但是当JVM在GC日志中打印“-”时,我想在Java 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("--");
  }
}

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

使用GC的理由-使用G1收集器

当幸存者区域没有足够的空间容纳年轻区域中的幸存物体时,G1的疏散失败。

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



 类似资料:
  • Tracing References # gc_get_referents.py import gc import pprint class Graph: def __init__(self, name): self.name = name self.next = None def set_next(self, next):

  • 问题内容: 什么是JavaScript垃圾回收?为了编写更好的代码,对于Web程序员来说,了解JavaScript垃圾回收有什么重要意义? 问题答案: 从该页面引用: JScript使用了非世代的标记清除垃圾收集器。它是这样的: 每个“范围内”的变量都称为“清除剂”。清道夫可以指数字,对象,字符串等。我们维护一个清道夫列表- 变量进入作用域时将移入scav列表,超出范围时将其移出scav列表。 垃

  • 本文向大家介绍浅析Java中的GC垃圾回收器的意义及与GC的交互,包括了浅析Java中的GC垃圾回收器的意义及与GC的交互的使用技巧和注意事项,需要的朋友参考一下 对象是使用new创建的,但是并没有与之相对应的delete操作来回收对象占用的内存。当我们完成对某个对象的使用时,只需停止对该对象的引用:将我们的引用改变为指向其他对象或指向null;或者从方法中返回,使得该方法的局部变量不复存在,从而

  • 问题内容: 我是Java新手,对Java中的垃圾收集器感到困惑。它实际上是做什么的,什么时候生效。请描述Java中垃圾收集器的一些属性。 问题答案: 该垃圾收集器是运行在一个程序的Java虚拟机,其摆脱其未使用的Java应用程序了对象。它是自动内存管理的一种形式。 当典型的Java应用程序运行时,它正在创建新的对象,例如和,但是在一段时间之后,这些对象将不再使用。例如,看下面的代码: 在上面的代码

  • 问题内容: 垃圾收集日志中的“完整GC(系统)”条目是什么意思?那个叫System.gc()的类? 我的垃圾收集日志对“ full gc”有两种不同的输入类型?一个带有“系统”一词,另一个没有。有什么不同? (更新:我搜索了这个词,但没有找到明确的答案,只有几个问题。所以我认为应该发表。) 系统: 164638.058:[完整GC (系统) [PSYoungGen:22789K-> 0K(9924

  • 问题内容: 我已配置Java将垃圾回收信息转储到日志中(详细GC)。我不确定日志中的垃圾回收项是什么意思。这些条目的示例发布在下面。我在Google上四处搜寻,但找不到可靠的解释。 我有一些合理的猜测,但我正在寻找答案,这些答案提供了对条目中数字含义的严格定义,并有可靠的依据。引用sun文档的所有答案的自动+1。我的问题是: PSYoungGen指的是什么?我认为这与上一代(年轻人)有关,但是究竟