java.lang.InternalError:无法连接到X11窗口服务器以进行JVisualVM分析会话

时间:2014-06-11 01:41:36

标签: java ubuntu jvisualvm x11

我有一个Ubuntu服务器VM(myapp01),并在那里部署了一个Java应用程序。该应用程序一直表现得很糟糕,我想用JVisualVM来描述它。为此,我需要在我的Windows 7主机上安装X-Windows,然后让Ubuntu VM将其X11连接导出到我的主机,当我告诉它在VM上运行JVisualVM时。

所以我开始在这里下载XMing:

http://sourceforge.net/projects/xming/files/Xming/6.9.0.31/Xming-6-9-0-31-setup.exe/download

我使用了所有默认/推荐的安装选项,包括使用普通的PuTTy会话并允许公开和使用专用网络访问。安装XMing后,我启动了它并验证它是否在我的Windows主机上运行。然后我打开了Cygwin并SSH连接到Ubuntu服务器:

$ ssh myuser@myapp01
myuser@myapp01's password:
Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.5.0-23-generic x86_64)

* Documentation:  https://help.ubuntu.com/

System information as of Tue Jun 10 21:26:15 EDT 2014

System load:  0.0                Processes:           82
Usage of /:   22.5% of 11.81GB   Users logged in:     0
Memory usage: 30%                IP address for eth0: 10.10.41.108
Swap usage:   0%

    Graph this data and manage this system at:
    https://landscape.canonical.com/

38 packages can be updated.
30 updates are security updates.

Last login: Tue Jun 10 15:03:35 2014 from 10.10.101.96

然后我将显示导出到出现作为我主机的IP:

myuser@myapp01:~$ export DISPLAY=10.10.101.96

然后我尝试运行JVisualVM:

myuser@myapp01:~$ cd $JAVA_HOME
myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64$ ls
bin  COPYRIGHT  db  include  jre  lib  LICENSE  man  README.html  release  src.zip  THIRDPARTYLICENSEREADME-JAVAFX.txt  THIRDPARTYLICENSEREADME.txt
myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64$ cd bin/
myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64/bin$ ./jvisualvm
Error: Can't connect to X11 window server using '10.10.101.96' as the value of the DISPLAY variable.
See the /home/myuser/.visualvm/7u14/var/log/messages.log for details.
myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64/bin$ vim /home/myuser/.visualvm/7u14/var/log/messages.log

内部/home/myuser/.visualvm/7u14/var/log/messages.log

java.lang.InternalError: Can't connect to X11 window server using '10.10.101.96' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:110)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:102)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:81)
    at org.netbeans.core.startup.Main.start(Main.java:200)
    at org.netbeans.core.startup.TopThreadGroup.run(TopThreadGroup.java:84)
    at java.lang.Thread.run(Thread.java:745)

想法?我被VPN,可能会影响到什么吗?我有没有错误配置XMing?我的export DISPLAY命令错了吗?

3 个答案:

答案 0 :(得分:9)

出于安全考虑,X服务器通常不接受来自其他主机的直接TCP连接。否则,人们可以将键盘记录器连接到您的X服务器,并且您的击键将通过未加密的网络传输,允许人们仅通过在同一LAN上记录密码。

但SSH提供了一种使用-X-Y选项在您的SSH会话上转发X11流量的安全方式。

在Windows计算机上,尝试从命令行打开$DISPLAY,确保xterm设置正确。 $DISPLAY可能会设置为:0,代表localhost:0。还有其他令牌用于验证存储在~/.Xauthority中的X服务器的连接,您可以使用xauth list进行查看。

现在,运行ssh -Y 10.10.101.96。如果收到X11 forwarding request failed on channel 0之类的消息,请运行ssh -v -Y 10.10.101.96来获取调试消息。如果远程计算机是服务器,原因可能是未安装xauth。在CentOS上,它位于xorg-x11-xauth RPM。

在远程计算机上,如果一切顺利,远程计算机上的$DISPLAY现在将设置为SSH设置的代理显示:

$ echo $DISPLAY
localhost:10.0

此时,您可以在远程计算机上运行xterm之类的命令,并在本地显示屏上弹出窗口。

虽然远程计算机上没有运行X服务器,但您可能仍需要为Java安装一堆X11库才能与本地X服务器通信...

答案 1 :(得分:0)

如果在Windows主机上安装了JDK,则无需通过XWindow和ssh从Unix主机使用JVisualVM。这是一个非常正确的解决方案,但如果您不习惯使用ssh和XWindow DISPLAY,而不是使用cygwin或XMing安装,它可能会很棘手......

此用例中最简单的解决方案是:

  • 在Linux主机上运行jstatd(优先使用相同的应用程序凭据进行调试)
  • 在Windows主机上运行jvisualvm并要求它连接到Linux主机

(有关进一步参考,请参阅有关jvisualvm和jstatd的文档)

答案 2 :(得分:0)

我已经解决了类似的问题。就我而言,在/etc/hosts文件中为运行sshd的服务器的主机名指定了错误的IP地址。

幸运的是,java应用程序给了我更详细的输出,而其他应用程序只是失败了Failed to open display消息。