java 多线程程序越运行越慢

问题遇到的现象和发生背景

最近开发一套视频切图程序,功能是读入FTP视频按秒切成图片存入数据库,采用的切图技术是javacv,为了提高效率程序每次取10个视频,每个视频启动一个线程来处理,启动线程我采用了ThreadPoolExecutor做线程池,但在运行时发现程序越运行越慢,我每个小时都会监控一下处理效率,发现效率呈现递减趋势发展开始衰减不多,但运行到30几个小时的时候程序效率就极其低下了,线程好像不动了正常情况一小时能够处理10小时视频,而后来一个两小时才能处理一个小时视频(服务器逻辑核56 颗cpu,内存125G)。

问题相关代码,请勿粘贴截图

我用jmap命令导出了dump,发现点问题但对优化经验不足个人觉得是些小问题不会影响这么大,下面我也贴出来大家看看

img

img

img

运行结果及报错内容

运行结果就是慢,日志并无报错

我的解答思路和尝试过的方法

一开始我没有采用线程池,以为是这个原因后来改成了线程池问题仍然没有得到改善,请各位高人帮我分析一下问题可能出现的原因或者怎样进一步排查,这个问题已经困扰我十多天了,万分感谢

按秒切图存图到数据库,你这个方案团队讨论过吗?
先不直接存图片,文件存第三方服务或者本地磁盘,库里面存个地址,看看这种处理,长时间运行后,是不是还是效率低下

看下gc日志呢,是不是有啥没释放导致空间占用越来越多,频繁gc

你这个有没有出现oom java.lang.OutOfMemoryError: GC overhead limit exceeded 如果出现这个的话你就需要看一下是不是存在内存泄漏的问题,具体就可以使用mat看一下线程中引用的对象有没有释放,或者说线程中操作的对象就是需要常驻内存,如果确实常驻内存的对象比较多,这种情况下可以调大内存,因为如果常驻对象占用内存较多的话,就会一直GC最终导致线程都用于GC了而没有线程资源去执行业务,导致业务执行效率下降

楼主怎么解决的?我也是这个问题