这个问题是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内数据导致内存一直增加。
最后希望我这种判断方式对大家都有帮助!
欢迎大家关注公众号
猜你喜欢
网友评论
- 搜索
- 最新文章
- 热门文章