我假设您正在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指出的那样,对于某些Flink应用程序而言,某些对象由于至关重要(状态)而从不释放,这也可能是固有的。
但是,我看不到您提供的内容有什么问题。我猜想您还有其他尚未分享的问题。您能否以反映您对第一个问题背后的想法的方式来重新表述您的问题?