记录Flink 线上碰到java.lang.OutOfMemoryError: GC overhead limit exceeded如何处理?

这个问题是Flink TM内存中我们常见的,看到这个问题我们就要想到下面这句话:

程序在垃圾回收上花了很多时间,却收集一点点内存,伴随着会出现CPU的升高。

是不是大家出现这个问题都会出现上面这种情况呢。那我的问题出现如下:

记录Flink 线上碰到java.lang.OutOfMemoryError: GC overhead limit exceeded如何处理?_第1张图片

发现JVM Heap堆内存过高。那么堆内存包含2块:

framwork heap 一般设置是128MB,基本上不会出问题

task heap 是我们用户写代码所使用的的堆内存,那我们就要考虑是不是自己业务代码有问题吗?

所以我使用以下判断方法发现问题的。

1 查看某个TM的堆内存占用是否过高,如果过高,通过页面的端口号找到该TM的PID。操作如下:

例:akka.tcp://flink@IP:23567/user/taskmanager_0

找到这个IP的端口,使用 netstat 找到PID  --->  netstat -atunpl | grep 23567

tcp6       0      0 :::23567                :::*                    LISTEN      3081/java  
   

得到该TM的进程为3081

2 利用命令:jmap -histo:live pid 对该PID进行操作

命令:jmap -histo:live 3081  | head -20  得到

 num     #instances         #bytes  class name
----------------------------------------------
   1:      24781126      792996032  java.util.HashMap$Node
   2:      21094139      737237032  [C
   3:      21094065      506257560  java.lang.String
   4:       1560788      225984352  [Ljava.util.HashMap$Node;
   5:       1557686       74768928  java.util.HashMap
   6:        195141       59546144  [B
   7:       1198174       38341568  java.util.concurrent.ConcurrentHashMap$Node
   8:       1548207       24771312  com.alibaba.fastjson.JSONObject
   9:         39805        9853696  [Ljava.lang.Object;
  10:          1225        9522400  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  11:        157686        5045952  org.apache.hadoop.hbase.Key

发现使用HashMap占用太多,寻找自己使用HashMap的方法进行排查,发现没有释放HashMap内数据导致内存一直增加。

最后希望我这种判断方式对大家都有帮助!

欢迎大家关注公众号

记录Flink 线上碰到java.lang.OutOfMemoryError: GC overhead limit exceeded如何处理?_第2张图片

你可能感兴趣的:(Flink,java,flink,开发语言)