公司选型采用ignite 记录实时数据,用于快速查询,实时存储
使用场景: PLC采集点-> KafKa -> Flink -> ignite
数据规模: 每10毫秒1条
开始测试的时候一切正常, 经过一次大的开发变动后发现,启动插入数据程序后十分钟
ignite日志中就会报 Possible too long JVM pause: 1054 milliseconds.
随后一段时间ignite使用变得非常慢,随后报 java.lang.OutOfMemoryError: Java heap space
ignite崩溃....
抓dump日志进行分析,heap内存中存在大量这个对象...
使用java自带的内存监控工具发现老区一直再涨又不回收,....
分析原因:
1. 因为代码进行过大量的修改, 开始觉得是代码有问题,将代码全部回退后发现依然有问题
2. 因为在Flink中使用的是Mybatis,怀疑是建连接的问题,连接没有释放,于是使用存jdbc插入数据发现没有问题
经过仔细核对代码发现是使用了ignite 自带的函数创建主键,插入语句uuid()
insert into abc_table (id,col_a,col_b) values (uuid(),'1','2');
大量插入会导致heap fgc不回收,咱也是初次使用ignite,咱也不知道这算不算ignite的bug`````````大神可以给解释解释
修改为 insert into abc_table (id,col_a,col_b) values (#{uuid},'1','2'); uuid从java中创建即可
到此修改后, 内存就正常了,没问题了,问题解决了