导致服务器所有的java程序 都无法创建新的线程而停止
初步发现 JavaDStream foreachRDD时 是正常的 主要问题应该是
JavaInputDStream 在flatMap创建的线程没有回收 通过日志打印
在flatMap方法里面 创建的线程名称 Executor task launch worker for task 数在不断增加没有回收
解决 JavaInputDStream 在flatMap创建的线程没有回收 问题
线程池大家都懂, 关键是怎么控制 JavaInputDStream 在flatMap的线程池
重启
数据量多大 有没有考虑过 确实是数据量太大了,导致实际确实需要这么多线程, 顺便在看看是是不睡哪一步卡住了 导致线程任务一直没有结束,
一般都是用线程池, 多余的任务回进入队列,队列满了,就增加线程数, 线程数满了 队列满了,就有处理器,你可以线程池看看, 这样最起码不会出现 线程过多问题, 过高的线程数会导致cpu频繁切换,性能会更差, 用线程池后,你可以打印线程池相关指标, 帮助推断是哪里的问题.
我看代码里有查询, 我怀疑是数据量有些大,然后查询占用一点时间,导致线程数累加, 累加的线程数导致cpu频繁切换线程,恶性循环,就成这样了.
这就要jstack jmap出手了,光看代码可没直接参考意义
错误提示的很明显就是 线程太多导致内存溢出,多半是线程内部代码问题导致挂起了,可以给线程设置最大超时时间,超时后强制释放,再者就是控制线程的合理数量和纠正内部代码问题
线程引起的内存泄漏?
排查步骤:
1,首先"jmap -heap pid"确认逻辑问题
2,“jstat -gcutil ” 分析gc是否正常执行
3,确认下版本新增代码的改动,尽快从代码上找出问题
4,开启各种命令行和导出dump 各种工具分析
真的假的?解决了就有30嘛?朋友还可以调高点么
flatMap的线程池需要一个管理,如果是框架自带的,肯定是会回收的,只有你自己实现的才会出现不会回收,出现这种情况,你需要自己实现线程池的管理,通过心跳去检测线程的状态来回收没在使用的线程
“你也不看看自己有多大能耐就开这么多线程,能回收你来找我”
最终 通过这个解决了问题 ,对资源参数调优 https://www.pianshen.com/article/656232905/#%E8%B5%84%E6%BA%90%E5%8F%82%E6%95%B0%E8%B0%83%E4%BC%98
可以重启啊,先保存