You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by "junjie.miao@goupwith.com" <ju...@goupwith.com> on 2023/01/18 05:21:53 UTC

flink1.15.3 jvm metaspace一直上涨不会释放直至溢出

目前我们使用flink local模式用于开发平台的flink sql预览调试,发现一个问题是JVM metaspace一直上涨不会被回收。
正常情况应该是每次执行完,其FlinkUserCodeClassLoader中所有加载的类会被gc所回收,通过本地代码调试发现flink自身这块应该有BUG。

flink版本为1.15.3

测试代码如下,metaspace会一直上涨永远不会被gc回收。
import org.apache.flink.configuration.Configuration;
import org.apache.flink.configuration.CoreOptions;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.TableResult;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;

import java.util.ArrayList;
import java.util.List;

public class FlinkSqlTest {

    private static String createSql = "CREATE TEMPORARY TABLE datagen (\n" +
            "  `f1` STRING,\n" +
            "  `f2` INTEGER,\n" +
            "  `f3` TIMESTAMP(3),\n" +
            "  `pt` AS PROCTIME()\n" +
            ") WITH (\n" +
            "  'connector' = 'datagen',\n" +
            "  'rows-per-second' = '10'\n" +
            ", 'number-of-rows' = '100'" +
            ")";

    private static String selectSql = "select * from datagen";

    public static void main(String[] args) {
        for (int i = 0; i < 50; i++) {
            Configuration configuration = new Configuration();
            configuration.set(CoreOptions.DEFAULT_PARALLELISM, 1);
//            configuration.set(CoreOptions.CLASSLOADER_RESOLVE_ORDER, "parent-first");
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(configuration);
            StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);
            List<TableResult> tableResults = new ArrayList<>();
            tableResults.add(tEnv.executeSql(createSql));
            tableResults.add(tEnv.executeSql(selectSql));
            tableResults.forEach(tableResult -> tableResult.getJobClient().ifPresent(jobClient -> {
                try {
                    jobClient.getJobExecutionResult().get();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }));
            System.out.println("-----------------" + i + "执行结束----------------");
        }
        try {
            Thread.sleep(24 * 60 * 60 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("-----------------休眠结束----------------");
    }

}