问题标签 [g1gc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 跟进:G1 收集器没有进行完整的 GC
已移除
-XX:MaxGCPauseMillis=100
-XX:InitiatingHeapOccupancyPercent=80
IHOP 的默认值为 45%
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
0 96M 0 96M 3.4G 704M 6.5G 5.5G 640M 451.2M 6739 44.4m 0 0m 44.4m
老年代达到 5.5G 的大小仍然没有发生完整的 GC。知道为什么吗?
谢谢,萨米尔
java - G1 启动并发标记周期时的年轻 GC 时间长
JDK版本:
GC/Mem 参数:
偶尔,我看到很长的年轻 gc 暂停超过 1 分钟。我检查了 GC 日志,发现它们都出现了混合 gc 事件的并发标记周期初始化。由于young gc的估计暂停非常快,我的猜测是并发标记周期正在影响正常的young gc性能。我怎样才能减少影响?我检查了 gc 日志。大多数并发标记周期对young gc没有影响,只有极少数影响很大。gc 日志是这样的:
java - 为什么 G1 的对象复制要花这么多时间?
以下是我的 gc 日志:
我的java选项是:
另外,我的 cpu 有 16 个核心。所以在我将 ParallelGCThreads 减少到 15 之后,它把年轻 gc 时间减少了一半。但是这个问题还是发生了。以下是新的 gc 日志:
scala - Spark:shuffle 操作导致长时间的 GC 暂停
我正在跑步Spark 2
,并试图洗牌大约 5 TB 的 json。在改组 a 期间,我遇到了很长的垃圾收集暂停Dataset
:
是否有任何明显的配置调整来处理这个问题?我的配置如下:
java - Java VM 何时支持 Linux ARM 的垃圾优先 (G1) 收集器?
我目前正在开发项目,该项目涉及在 ARM 上运行系统,使用 java 作为主要执行语言。不幸的是,Java 7 VM 不支持 ARM 板的 G1 gc,但我还没有发现任何关于 Java 8 中 ARM 的 G1 支持。当构建一个需要非常一致和快速响应的系统时,垃圾收集器是一个潜在的问题. 我尝试调整 CMS gc,但结果很糟糕。年轻代的暂停时间约为 50-100 毫秒。
java - 使用 G1 收集器时防止 JVM 将堆释放回操作系统
我想使用最新的 G1 垃圾收集器,但是我遇到了在使用它时遇到内存分配错误的情况。我相信这是因为它正在将内存释放回操作系统,然后操作系统不允许 JVM 在请求时将其取回,因为 CMS 收集器不会发生这种情况。我正在运行的特定服务器与 CMS 收集器一起运行良好(除了一些不太理想的 GC 暂停),一旦我将它移动到 G1,它会在运行大约 6 小时后遇到这些分配错误并且 JVM 存在。
目前尚不清楚 G1 收集器是否可以防止这种情况发生,但我希望社区中的某个人能给出答案。
谢谢!
java - 为什么 G1 提供更好的暂停时间但吞吐量更低?
为什么 G1 提供更少的暂停时间但更低的吞吐量(更低的吞吐量意味着 GC 将运行更多的总时间(以秒为单位))
根据我的理解,由于内存被分成更小的部分,现在 full 必须在比 complete heap 更小的部分上运行。事实上,我们可以说现在没有完整的 GC,因为它没有在完整的堆上运行,而是有多个后台线程同时运行并首先清除那些包含最大死对象数量的内存块。所以暂停时间很短。
吞吐量较低,因为较大的内存已被划分为较小的块,因此多个 GC 线程必须在较小的块上而不是单个块上运行。所以大部分时间都会很忙
那是对的吗 ?
还有为什么 G1 更适合大于 4GB 的堆?我相信它应该适用于所有堆大小,因为它会分成更小的阻塞器并且暂停时间会很慢。那么为什么建议 G1 用于大于 4 GB 的堆?
java - Java G1 GC 调优问题:未收集旧区域
我目前正在尝试调整 Apache NiFi 以使其与高吞吐量流一起工作,但我无法避免 Full GC。
当流启动时,会发生非常快的年轻 GC,但它们无法应对分配需求,直到最终触发 Full GC。这种情况发生在不同的堆大小(从 8GB 到 50GB)和基本配置(根据oracle 文档只配置了区域大小和指定线程):
以下是使用 GCViewer 执行的 GC dump 分析:
查看日志,我注意到为混合 GC 选择的旧区域的计数始终为零。根据这篇非常有用的文章,您可以增加删除InitiatingHeapOccupancyPercent的幅度,并允许标记阶段更早开始。这似乎没有任何影响,因为选择的旧区域的计数仍然为零:
根据 oracle 文档,我可以使用一些实验性标志,例如G1MixedGCLiveThresholdPercent=65,但即使我在其他所有内容之前添加UnlockExperimentalVMOptions标志,我也会收到以下错误:
基本上,该标志被忽略。
首先,是否是旧区域的非收集触发了完整的 GC?如果是这样,我如何设法收集旧区域并为应用程序需要释放足够的内存?
谢谢大家的帮助。
java - 巨量分配:如果发生巨量分配,我如何要求 jvm 打印日志
我正在使用 G1GC。
有没有我可以传递给 jvm 的 jvm 参数,所以每次发生 Humongous 分配时我都会得到一个 gc 日志?
java - JVM G1GC 的混合 gc 没有收集太多旧区域
我的服务器在 CentOS 6.7 上使用 1.8.0_92,GC 参数是 '-Xms16g -Xmx16g -XX:+UseG1GC'。所以默认的 InitiatingHeapOccupancyPercent 是 45,G1HeapWastePercent 是 5,G1MixedGCLiveThresholdPercent 是 85。我的服务器的混合 GC 从 7.2GB 开始,但是它清理的越来越少,最后老一代保持大于 7.2GB,所以它总是尝试做并发标记。最后,所有堆都用尽了,发生了完整的 GC。完全 GC 后,使用的 old gen 小于 500MB。
我很好奇为什么我的混合 GC 不能收集更多,看起来实时数据没有那么多......
我试过打印 g1 相关信息,发现很多类似下面的消息,看起来我的老一代包含很多实时数据,但是为什么 full GC 可以收集这么多......
下面的日志是修改 InitiatingHeapOccupancyPercent 为 15(在 2.4GB 开始并发标记)以加快速度的结果。
编辑:
我尝试在混合 GC 之后触发 full GC,它仍然可以减少到 4xx MB,所以看起来我的老一代有更多的数据可以收集。
在full gc之前,混合的gc日志是
编辑: 2016/12/11
我已经从另一台机器上用-Xmx4G
.
我使用 lettuce 作为我的 redis 客户端,它使用 LatencyUtils 具有跟踪功能。它使 LatencyStats(其中包含一些long[]
具有近 3000 个元素的元素)实例每 10 分钟弱引用一次(发布后重置延迟默认为 true,https://github.com/mp911de/lettuce/wiki/Command-Latency-Metrics)。所以在很长一段时间后它会对 LatencyStats 产生很多弱引用。
目前我不需要跟踪生菜,所以只需禁用它,它就不再有完整的 GC。但不确定为什么混合 gc 不能清除它们。