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

我有一个Ubuntu服务器VM( myapp01 ),并在那里部署了一个Java应用程序。 该应用程序已经行动不起来,我想与JVisualVMconfiguration文件。 要做到这一点,我需要在我的Windows 7主机上安装X-Windows,然后让Ubuntu虚拟机将其X11连接导出到我的主机,当我告诉它在VM上运行JVisualVM时。

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

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

我使用了所有默认/推荐的安装选项,包括使用普通的PuTTy会话,并允许公共和专用networking访问。 安装XMing之后,我启动了它并validation它在我的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) 

想法? 我被骗了,这可能会影响任何东西吗? 我有XMingconfiguration错误吗? 我的export DISPLAY命令是否错误?

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

但SSH提供了一种安全的方式来通过SSH会话转发X11流量,使用-X-Y选项。

在你的Windows电脑上,通过尝试从命令行打开一个xterm ,确保$DISPLAY设置正确。 $DISPLAY可能会被设置为:0代表localhost:0 。 还有一些额外的令牌,用于验证存储在~/.Xauthority中的X服务器的连接,您可以使用xauth list查看该连接。

现在运行ssh -Y 10.10.101.96 。 如果X11 forwarding request failed on channel 0收到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服务器通信。

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

在这个用例中最简单的解决方案是:

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

(有关jvisualvm和jstatd的更多参考文档,请参阅文档)

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

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