原文地址:
http://blog.csdn.net/luozhenyu/archive/2008/11/07/3247740.aspx
最近的一个项目,采用JSP+Servlet开发的Web应用,功能不复杂,涉及到一些多线程处理及网络编程。测试期间发现在会造成系统时钟变快,基本运行不到一小时就快了10来分钟,开出时钟程序能明显感觉秒钟跳动比较快。检查过代码没有用到任何有关时间设置的调用,JVM、TOMCAT也换过多个版本,依然没能解决问题。由于我们的项目程序不运行时系统时钟一切正常,启动后立刻变快,初步硬件或是其他程序造成的问题。另外,最奇怪的是并不是所有机器上运行都有这种问题,公司里的3台2003Server上,2台有此现象,另一台始终正常,开发用的一些xp/vista的机器也不都存在这个问题。
着实郁闷了很长一段时间,始终找不到问题的关键,更没法找到解决办法。前两天偶然查到一篇SUN网站bug库中早些年的一篇文章:(ID:4500388)Calling Thread.sleep with small argument affects system clock on windows ,其中说明了当多线程处理时,调用Thread.sleep()方法时,若sleep的参数小于10ms就可能会造成windows系统时钟变快。不过该bug标记为jvm 1.3中才存在,并且已经在后续版本fixed,而我们开发都是用的1.6版本。于是搜索了下项目代码,确实有用到Thread.sleep()方法的地方,而且某些部分由于需求关系,程序中的参数不定的,会依据一定算法计算出来,这样就有可能小于10ms,尽管理论上我们代码中可能最小只设定到50ms左右。
接下来继续搜了下其他的bug report,包括ID为5005837 、6435126的文章,发现上述问题并未根本解决。根据文章中提到的ForceTimeHighResolution关键字google一下,发现这个参数是JVM 中的一个;另外搜到老外的帖子里有一篇关于applet游戏程序时钟走快后,其厂商给出的解决办法,就是需要开启ForceTimeHighResolution参数!
这下好了,这应该就是解决问题的关键所在。重新将项目服务器时间校准,然后在TOMCAT的catalina.bat中将JAVA_OPTS参数中增加一项 -XX:+ForceTimeHighResolution (注意 - 和 + 都是有的),启动TOMCAT运行。查看时钟,感觉没有变快,运行1小时后,未发现变快现象,看来这个参数确实很有效。剩下工作就是把所有安装项目程序的服务器都修改了参数设置,进行长时间运行测试,直至目前为止,均未在出现时钟变快的现象。
没想到JVM还有这样的BUG。至于程序中开启了ForceTimeHighResolution这个参数会不会带来别方面问题,还无从得知,只有待时间来检验了。
分享到:
相关推荐
java语言,利用多线程编写的时钟程序源代码。仅供参考。
java application multiThread clock,模拟时钟(AWT程序、Runnable接口),有时、分、秒针 编写一个应用程序,创建三个线程分别显示各自的时间。
运用java多线程技术编写的时钟程序,具有时钟的界面
用java语言实现时钟程序,其中用到多线程、swing组件等
时钟控件 学习多线程的一个经典例子 JAVA编写 对于多线程的理解有一定的帮助和参考
联系多线程,学会多线程画图
用java多线程模拟一个简单的时钟程序,希望大家提出宝贵意见。
一个简单 seconds=MyTimer.intHour*60*60+MyTimer.intMinute*60+MyTimer.intSecond; seconds+=a;//a为秒自加 repaint();} else { seconds = calendar.get(Calendar.HOUR) * 60 * ...的小程序,大家可以看看,
用applet编写的一个简单的时钟小程序,有动态的时钟模拟画面。
要求:本实验旨在通过实验,培养学生将JAVA 线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中 设计多线程程序的能力。 二、设计阵哼赤贫烹窖炉银稀硕匣趣奋锻换示哮拳染恤刁杨纺意卖...
用java多线程模拟一个简单的时钟程序,互相学习和交流
基于JAVA的安卓多线程时钟,简单代码
java多线程的实例,我利用了java自带的多线程的实例变成,是线程里面显示北京时间和伦敦时间
本实验旨在通过实验,培养将JAVA 线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中设计多线程程序的能力。 设计和编写一个编写一个指针式时钟程序,应用线程实现时钟的走动。
多线程程序包含同时运行的两个或多个部分。这种程序的每一部分被称为一个线程,并且每个线程定义了单独的执行路径。因此,多线程是特殊形式的多任务处理。 第5页 Java程序设计案例教程-第8章-多线程编程全文共36页,...
这学期做的一个Java大作业,不大,就两个文本文件
用java写的一个数字时钟,弹出的窗口用于显示当前系统时间,使用液晶字体显示时间,效果更炫 这个小案例汇集了众多java功能,图形用户编程、多线程等
秒针,分针和时针随时间移动,显示当前的时间,使用多线程操作。用swing布局,背景颜色,3,6,9,12需要用红色强调颜色。其他时刻用黑色。
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
java多线程的应用,以一个时钟显示程序作为案例进行分析