用了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 方法只是一个数据库的查询操作,目前搞不清楚到底是什么原因造成的。
第一种,采用的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 方法只是一个数据库的查询操作,目前搞不清楚到底是什么原因造成的。
注解@Scheduled
是的目前分析到的是,内存一直在不断增加,导致的 客户端进程卡死。。由于客户端有定时任务,每隔30秒会查询一次数据库,然后刷新客户端页面,但是会导致客户端的内存慢慢的增长,我通过调用gc 方法,也基本没什么效果,代码中将方法里面的变量最后都设置为null也不见有什么效果~~0.0 返回的数据是通过 org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor 远程调用返回的结果
程序没问题,那重心放在应用服务器(如tomcat、apache等)内存配置上
是的目前分析到的是,内存一直在不断增加,导致的 客户端进程卡死。。由于客户端有定时任务,每隔30秒会查询一次数据库,然后刷新客户端页面,但是会导致客户端的内存慢慢的增长,我通过调用gc 方法,也基本没什么效果,代码中将方法里面的变量最后都设置为null也不见有什么效果~~0.0 返回的数据是通过 org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor 远程调用返回的结果如果是这样,可以试着把定时器查询出来的结果保存在内存Map中,然后客户端页面只要去取这个内存中的Map数据即可,这样即使有多个客户在使用,也只是直接从内存中取数据,不需要再去查一次,不会造成查询很多次导致内存溢出。
单个定时器查询 内存是扛得住的。你的代码如果多个客户去用,应该就会导致每个人都会去查询一次,查询次数过多,卡死很正常。