用户空闲时间超过10分钟后,Java应用程序会使屏幕显示无响应

我编写了一个Java应用程序,允许用户编写鼠标/键盘输入脚本( JMacro ,链接并不重要,只是为了好奇)。 我个人使用该应用程序在我睡觉的同时在线游戏中自动执行角色动作。 不幸的是,我一直在早上回到电脑前发现它没有反应。 经过进一步测试,我发现我的应用程序导致计算机在大约10分钟的用户空闲时间后无响应(即使应用程序本身模拟用户活动)。 我似乎无法指出这个问题,所以我希望其他人可能会建议在哪里寻找或可能导致问题的原因。

相关症状和特征:

  • 用户闲置10分钟后发生无响应
  • 用户仍然可以在屏幕上移动鼠标指针
  • 除鼠标外的所有内容都显示为冻结…鼠标单击无效,并且没有应用程序更新其显示,包括Windows 7桌面
  • 我让应用程序管理器一起在应用程序中过夜,所以我可以在屏幕冻结之前看到最后一个任务管理器图像… Java应用程序正常CPU /内存使用率和总CPU使用率仅为~1%
  • 移动鼠标后(换句话说,用户从空闲状态返回),屏幕图像在30分钟内再次开始更新(这是非常受欢迎的,有时是10分钟,有时在两小时后没有结果)
  • 用户可以按CTRL-ALT-DEL进入Windows 7的CTRL-ALT-DEL屏幕(暂停30秒后)。 用户仍然可以移动鼠标指针,但单击任何按钮选项会导致屏幕再次冻结
  • 在一些非常罕见的情况下,系统永远不会冻结,我会在早上回到它并充分响应
  • Java应用程序会在半夜自动停止输入脚本,因此Windows 7检测到“真正的”空闲状态并将显示器转为待机模式……当我醒来时,他们在早上手动移动鼠标时成功退出即使桌面显示仍然显示为冻结

鉴于问题的症状和特征,就好像Java应用程序导致登录用户的桌面显示停止更新,包括任何正在运行的应用程序。

使用的编程概念和Java包:

  • multithreading
  • 标准输出错误被重新路由到javax.swing.JTextArea
  • 该应用程序使用Swing GUI
  • awt.Robot(非常使用)
  • awt.PointerInfo
  • awt.MouseInfo

系统规格:

  • Windows 7专业版
  • Java 1.6.0 u17

总之,我应该强调,我不是在寻找任何具体的解决方案,因为我没有提出一个非常具体的问题。 我只是想知道在使用我正在使用的Java库时是否有人遇到过类似的问题。 我也很乐意感谢任何有关尝试进一步查明造成问题的原因的建议。

谢谢!

罗斯

PS,我会发布更新/答案,如果我在继续调试时遇到其他任何事情。

更新:我的应用程序涉及multithreading进程,每个进程初始化自己的Robot对象并异步创建输入事件。 我重构了应用程序只包含一个Robot单例对象,但不同的进程仍然异步调用输入命令。 据我所知,这并没有改变我的应用程序的行为。 我的下一步可能是在Robot单例周围创建一个同步包装器,看看是否有帮助,但鉴于症状,我不知道为什么会这样。

我以前在使用Robot类时遇到了问题。 我完全忘记了我的所作所为,但它导致计算机锁定,我被迫重启。

我不熟悉Robot的变幻莫测,但是当事件调度线程死掉并重新启动时,GUI应用程序中的未捕获exception会产生非常奇怪的结果。 您可以从如何处理未捕获的exception中获得一些想法。

如果你激活任何屏幕保护程序或类似的东西,这可能会发生,然后这个机器人动作将停止工作

我通过以下方式得到了这个问题

我有一些基于GUI的应用程序,我写了一些基于Robot类的测试代码。

但如果我在我的系统中激活了屏幕保护程序,这个测试用例就停止了…

请检查您的情况是否存在任何此类情况

对于罗斯,我很确定你有一个政策问题,这意味着你没有获得许可并被win7阻止。 要获得此权限,您必须创建一个策略,这是一个很重要的故事。 检查您可以从sun网站获得哪些信息。

对于其他人,如果您的程序在一段时间后停止工作,则可能是您没有正确处理程序中的所有exception。 尝试在停止时获取该行:您可以通过向系统控制台发送一行文本并重写它以获得所需的性能来实现。

对于其余部分检查你的代码并检查它是非常好的,看你没有进入死锁,如果有它的东西可能会卡住你的电脑。

还要检查CPU使用情况,看看程序是否超载,如果CPU温度控制将重新启动或自动关闭PC。

如果我没有遇到问题,请告诉我; 如果你解决了这个案子,请让我知道你做了什么。

我们有两台机器与Java应用程序的行为几乎完全相同。

一个是Windows 7 64位,其中Eclipse 64位和Java 6(64位)导致完全相同的冻结。

另一种是Windows 7 32位和Java应用程序利用大量的CPU和磁盘活动导致冻结。

这两款机器都是东芝的笔记本电脑和现代CPU(Core 2 Duo)。

两台机器都安装了NOD32防病毒软件。

标准应用程序(Office,Skype,Firefox,…)

我们似乎跟踪了NOD32的问题。 当我们禁用NOD32时,似乎beahaviour不再出现。

我想指出,我认为它不是NOD32本身,而是Windows 7,Java JDK和NOD32的某种组合。

我在Mac OS X 10.6.7上遇到了类似的问题,但它并没有冻结整个系统,而是整个java进程,我的应用程序在其中运行,随机有趣。 解决方法是调用:

Toolkit.getDefaultToolkit();

在创建任何Robot之前,例如:

     public static void main(String [] args){    
         Toolkit.getDefaultToolkit();
         // Blah blah
     }

Robot类的init方法中进行相同的调用,所以看起来问题来自哪里,这是愚蠢的,对我来说没有多大意义,但现在工作得很好:)