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

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

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

发现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内数据导致堆内存一直增加。

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

欢迎大家关注公众号

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: