java

位置:IT落伍者 >> java >> 浏览文章

JAVA多线程程序造成系统时钟变快


发布日期:2021年12月24日
 
JAVA多线程程序造成系统时钟变快

最近的一个项目采用JSP+Servlet开发的Web应用功能不复杂涉及到一些多线程处理及网络编程测试期间发现在会造成系统时钟变快基本运行不到一小时就快了来分钟开出时钟程序能明显感觉秒钟跳动比较快检查过代码没有用到任何有关时间设置的调用JVMTOMCAT也换过多个版本依然没能解决问题由于我们的项目程序不运行时系统时钟一切正常启动后立刻变快初步硬件或是其他程序造成的问题另外最奇怪的是并不是所有机器上运行都有这种问题公司里的Server上台有此现象另一台始终正常开发用的一些xp/vista的机器也不都存在这个问题

着实郁闷了很长一段时间始终找不到问题的关键更没法找到解决办法前两天偶然查到一篇SUN网站bug库中早些年的一篇文章(ID:)Calling Threadsleep with small argument affects system clock on windows 其中说明了当多线程处理时调用Threadsleep()方法时若sleep的参数小于ms就可能会造成windows系统时钟变快不过该bug标记为jvm 中才存在并且已经在后续版本fixed而我们开发都是用的版本于是搜索了下项目代码确实有用到Threadsleep()方法的地方而且某些部分由于需求关系程序中的参数不定的会依据一定算法计算出来这样就有可能小于ms尽管理论上我们代码中可能最小只设定到ms左右

接下来继续搜了下其他的bug report包括ID为 的文章发现上述问题并未根本解决根据文章中提到的ForceTimeHighResolution关键字google一下发现这个参数是JVM 中的一个另外搜到老外的帖子里有一篇关于applet游戏程序时钟走快后其厂商给出的解决办法就是需要开启ForceTimeHighResolution参数!

这下好了这应该就是解决问题的关键所在重新将项目服务器时间校准然后在TOMCAT的catalinabat中将JAVA_OPTS参数中增加一项 XX:+ForceTimeHighResolution (注意 和 + 都是有的)启动TOMCAT运行查看时钟感觉没有变快运行小时后未发现变快现象看来这个参数确实很有效剩下工作就是把所有安装项目程序的服务器都修改了参数设置进行长时间运行测试直至目前为止均未在出现时钟变快的现象

经过这件事后确实没想到JVM还有这样的BUG以前C#的代码写的多接触JAVA时间不太长这次算是见识到了JAVA中千奇百怪的问题了不过至于程序中开启了ForceTimeHighResolution这个参数会不会带来别方面问题还无从得知只有待时间来检验了如果这方面有了解的朋友欢迎与我交流

上一篇:Java多线程初学者指南(11):使用Synchronized块同步方法

下一篇:开发JAVA编程中字符串分割的两种方法