【发布时间】:2020-03-23 12:50:43
【问题描述】:
【问题讨论】:
-
可以贴出你应用的代码。
标签: garbage-collection apache-flink flink-streaming
【问题讨论】:
标签: garbage-collection apache-flink flink-streaming
我假设您正在 flink 应用程序中执行一些有状态的操作。这将导致状态由 Flink 管理,该状态将存在于堆上。如果您不清除不再相关的状态,它将继续增长并最终导致 JVM 崩溃。
此状态不会被 GC,因为它对您的应用至关重要。
【讨论】:
Java 的垃圾收集器很难从应用程序中控制。如果机器没有空闲,GC 可能只会在它实际达到堆限制时发生。
从您的屏幕截图中,我可以看到可能从未调用过 GC。我实际上根本没有看到任何问题。如果您不希望 java 占用超过 50 MB 的 RAM,您应该相应地设置您的 Xmx。然后 GC 将在遇到障碍时被调用。
就像对 Java 领域的一次短途旅行:当不再使用对象时,不会立即释放内存。只有在调用 GC 时,才有可能回收该内存。您为 Java VM 提供了 2 GB 的 RAM,因此它认为它可以完全使用这 2 GB 而不会引起任何问题。为了提高性能,GC 被尽可能少地调用。因此,如果您离限制太远,它可能会选择根本不运行 GC。
Java 的 GC 不断改进,Java 8 已经相当老了。较新的版本可能更具侵略性,您实际上可能会在 Java 13 上看到不同的行为。您可以直接在 JVM_ARGS 中设置 GC。但我认为没有必要这样做。
正如 Gaurav Kumar 指出的那样,某些对象可能永远不会被释放,因为它们至关重要(状态)。
但是,我认为您提供的内容没有任何问题。我猜您还有其他尚未分享的担忧。您能否以反映您最初问题背后想法的方式重新表述您的问题?
【讨论】: