什么可能导致JVM锁定机器的鼠标点击和键盘输入?

时间:2012-03-23 15:07:41

标签: java linux jvm deadlock

我在Linux机器(RHEL 5)上运行Java 6,我的程序偶尔会锁定计算机的输入。没有鼠标点击或键盘敲击工作。奇怪的是,鼠标光标可以移动,CTRL + ALT + F2命令可以工作(尽管它不会启动终端)。

使用topjvisualvm我发现此过程没有内存泄漏或其他问题。但是,解冻计算机的唯一方法是从另一台计算机ssh并终止java进程。可能是这种行为的原因是什么?

我可以通过降低内存上限来偶尔重现它。似乎死锁可能在这里:

"Java2D Disposer" daemon prio=10 tid=0xae7d6800 nid=0x4451 in Object.wait() [0xae6ad000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0xb3253070> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
    - locked <0xb3253070> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
    at sun.java2d.Disposer.run(Disposer.java:127)
    at java.lang.Thread.run(Thread.java:662)

2 个答案:

答案 0 :(得分:1)

最可能的事情是,您在事件调度线程上执行长时间运行的任务,阻止它为用户输入事件提供服务,从而使您的UI无响应。

您可以通过运行jstack或JConsole并查看“AWT EventQueue”的堆栈跟踪来验证这一点。

另一种选择是您执行合法的UI任务,但底层代码效率低下。例如,您可能已定义了包含1000,000行的JTable,并且基于TableModel的基础LinkedList,导致每行O(n)访问。

答案 1 :(得分:1)

您描述的症状在我看来是未发布的X11键盘和指针抓取。这可能很容易由错误或无响应的GUI引起 - &gt; X11层。仔细检查您的GUI线程。

相关问题