【发布时间】:2016-12-18 12:07:21
【问题描述】:
我们的应用程序对延迟至关重要。为了减少 GC 暂停,我们重用对象。在这个过程的开始,我们分配了很多小对象,然后(几乎)没有分配内存。但是,我仍然看到以下 gc 日志:
2016-12-18T13:51:48.650+0200: 1.085: Total time for which application threads were stopped: 0.0001411 seconds, Stopping threads took: 0.0000203 seconds
2016-12-18T13:51:48.776+0200: 1.210: Total time for which application threads were stopped: 0.0002027 seconds, Stopping threads took: 0.0000183 seconds
2016-12-18T13:51:48.894+0200: 1.328: Total time for which application threads were stopped: 0.0002559 seconds, Stopping threads took: 0.0000194 seconds
2016-12-18T13:51:48.906+0200: 1.341: Total time for which application threads were stopped: 0.0002159 seconds, Stopping threads took: 0.0000199 seconds
2016-12-18T13:51:49.047+0200: 1.482: Total time for which application threads were stopped: 0.0002842 seconds, Stopping threads took: 0.0000208 seconds
据我了解,JVM 停止进程以运行所有引用并标记对象。这是对的吗?
我还看到此类日志的频率随着时间的推移而减少。所以我认为 GC 调整了一些内部参数,我希望一开始就提供它们。现在我使用以下参数运行进程:
-Xms10240m
-Xmx10240m
-server
-XX:+UseG1GC
-noclassgc
所有与详细 GC 相关的其余参数。我们的机器有足够的内存可以完全避免 gc。我如何向java解释它?
操作系统:Linux,JVM,oracle 或 openJDK。
谢谢。
【问题讨论】:
-
0.0002842 秒太长??
-
280 家工厂,对我们来说太长了。
-
0.0002842 秒不是 280 毫秒。它是 280 微秒,也就是 0.28 毫秒。
-
哦!你是对的,对不起。 280 micro 要好得多,但我们更愿意完全禁用它。
-
G1GC 收集器持续运行这些微收集以防止长时间的 GC 运行。如果你禁用这些,它最终会耗尽内存并且必须运行完整的 GC,这将是 long 和 10 Gb 堆 (相对而言,例如几秒甚至几分钟)。当它发生时,你肯定会感觉到那种,而且它最终会出乎意料地发生。这些微收集正是您在延迟关键系统中想要的,因为 10 多秒的 GC 运行会杀死您。
标签: java garbage-collection jvm