这个问题是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内数据导致内存一直增加。
最后希望我这种判断方式对大家都有帮助!
欢迎大家关注公众号