熟悉java的人都知道java.lang.OutOfMemoryError: Metaspace异常产生的原因是“元数据区”内存溢出了,从JDK8开始,HotSpot JVM废弃了永久区PermGen space,采用Metaspace保存class名称、字段、方法、字节码,、常量池、JIT优化代码等信息。所以出现这个异常的原因一般是加载到内存中的类太多了。
通过 ps -ef|grep flink
可以查看flink进程的Metaspace配置,如图:
还可以通过 jinfo -flag MetaspaceSize pid
和jinfo -flag MaxMetaspaceSize pid
查看Metaspace大小,MetaspaceSize是初始化大小,MaxMetaspaceSize是最大占用的大小,返回值的单位是字节。
那么Flink怎么配置Metaspace大小呢?可以在flink-conf.yaml中增加配置项taskmanager.memory.jvm-metaspace.size,例如 taskmanager.memory.jvm-metaspace.size: 256m
就是将Metaspace的最大值设置为256MB。
另外,下图展示了Flink配置项对应的jvm内存配置:
最后需要说明的是:上述内容针对Flink 1.10.0版本是适用的,如果配置不起作用,那应该是版本之间存在差异,请参考Flink官网。