定时器在客户端运行一会后,导致客户端卡死

队长给我球__ 2018-05-23 03:22:41
用了2种定时器,但是都会有不同程度的导致客户端卡死
第一种,采用的timer
timer.scheduleAtFixedRate(retask, 5000, 60000);
间隔时间越短出现卡死的时间越早
第二种 是ScheduledExecutorService
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(retask, 10, 30, TimeUnit.SECONDS);

执行的retask 是这个RefreshTask 类:

class RefreshTask extends TimerTask
{

@Override
public void run() {
isRunning = true;
try {
displayCurrentKeyWordInfoNoRuleByFilename();
} catch (Exception e) {
}
System.gc();
}
}

其中的 displayCurrentKeyWordInfoNoRuleByFilename 方法只是一个数据库的查询操作,目前搞不清楚到底是什么原因造成的。
...全文
1340 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 qq_39947814 的回复:
[quote=引用 4 楼 u010970951 的回复:] 估计是你查的数据太多了吧,占据内存了,来不及清理。oracle加载数据多起来很容易挂掉
是的目前分析到的是,内存一直在不断增加,导致的 客户端进程卡死。。由于客户端有定时任务,每隔30秒会查询一次数据库,然后刷新客户端页面,但是会导致客户端的内存慢慢的增长,我通过调用gc 方法,也基本没什么效果,代码中将方法里面的变量最后都设置为null也不见有什么效果~~0.0 返回的数据是通过 org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor 远程调用返回的结果[/quote] 如果是这样,可以试着把定时器查询出来的结果保存在内存Map中,然后客户端页面只要去取这个内存中的Map数据即可,这样即使有多个客户在使用,也只是直接从内存中取数据,不需要再去查一次,不会造成查询很多次导致内存溢出。 单个定时器查询 内存是扛得住的。你的代码如果多个客户去用,应该就会导致每个人都会去查询一次,查询次数过多,卡死很正常。
天行归来 2018-05-28
  • 打赏
  • 举报
回复
引用 6 楼 qq_39947814 的回复:
引用 2 楼 lynmison 的回复:
检查下数据库连接占用情况,或许因为连接池满了,等待释放方可再次连接?
数据库连接没问题,现在定位到的是内存一直在增加,释放很慢导致的卡死
引用 6 楼 qq_39947814 的回复:
引用 2 楼 lynmison 的回复:
检查下数据库连接占用情况,或许因为连接池满了,等待释放方可再次连接?
数据库连接没问题,现在定位到的是内存一直在增加,释放很慢导致的卡死
程序没问题,那重心放在应用服务器(如tomcat、apache等)内存配置上
队长给我球__ 2018-05-28
  • 打赏
  • 举报
回复
引用 1 楼 dgqjava 的回复:
不把相关的代码贴出来不好具体分析
是的目前分析到的是,内存一直在不断增加,导致的 客户端进程卡死。。由于客户端有定时任务,每隔30秒会查询一次数据库,然后刷新客户端页面,但是会导致客户端的内存慢慢的增长,我通过调用gc 方法,也基本没什么效果,代码中将方法里面的变量最后都设置为null也不见有什么效果~~0.0 返回的数据是通过 org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor 远程调用返回的结果
队长给我球__ 2018-05-28
  • 打赏
  • 举报
回复
引用 2 楼 lynmison 的回复:
检查下数据库连接占用情况,或许因为连接池满了,等待释放方可再次连接?
数据库连接没问题,现在定位到的是内存一直在增加,释放很慢导致的卡死
队长给我球__ 2018-05-28
  • 打赏
  • 举报
回复
引用 4 楼 u010970951 的回复:
估计是你查的数据太多了吧,占据内存了,来不及清理。oracle加载数据多起来很容易挂掉
是的目前分析到的是,内存一直在不断增加,导致的 客户端进程卡死。。由于客户端有定时任务,每隔30秒会查询一次数据库,然后刷新客户端页面,但是会导致客户端的内存慢慢的增长,我通过调用gc 方法,也基本没什么效果,代码中将方法里面的变量最后都设置为null也不见有什么效果~~0.0 返回的数据是通过 org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor 远程调用返回的结果
  • 打赏
  • 举报
回复
估计是你查的数据太多了吧,占据内存了,来不及清理。oracle加载数据多起来很容易挂掉
竹子_bamboo 2018-05-23
  • 打赏
  • 举报
回复
用sping 的定时器很方便的,目前没发现卡死现象 注解@Scheduled
天行归来 2018-05-23
  • 打赏
  • 举报
回复
检查下数据库连接占用情况,或许因为连接池满了,等待释放方可再次连接?
dgqjava 2018-05-23
  • 打赏
  • 举报
回复
不把相关的代码贴出来不好具体分析

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧