问题
I have an Ubuntu server VM (myapp01
) and have a Java application deployed there. The app has been acting wonky and I would like to profile it with JVisualVM. To do this I need to install X-Windows on my Windows 7 host, and then get the Ubuntu VM to export its X11 connection to my host when I tell it to run JVisualVM on the VM.
So I started by downloading XMing here:
http://sourceforge.net/projects/xming/files/Xming/6.9.0.31/Xming-6-9-0-31-setup.exe/download
I used all default/recommended installation options, including using a normal PuTTy session and allowing public & private network access. After installing XMing, I launched it and verified it was running on my Windows host. I then opened up Cygwin and SSHed into the Ubuntu server:
$ 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
I then export the display to what appears to be my host's IP:
myuser@myapp01:~$ export DISPLAY=10.10.101.96
I then attempt to run 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
Inside /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)
Ideas? I am VPNed in, could that be affecting anything? Do I have XMing misconfigured somehow? Is my export DISPLAY
command wrong?
回答1:
For security purposes, X servers won’t generally accept direct TCP connections from other hosts. Otherwise people could connect keyloggers to your X server, and your keystrokes would pass over the network unencrypted, allowing people to record passwords just by being on the same LAN.
But SSH provides a secure way to forward X11 traffic over your SSH session, using the -X
or -Y
options.
On your windows computer, make sure $DISPLAY
is set correctly by trying to open an xterm
from the command line. $DISPLAY
will probably be set to :0
which stands for localhost:0
. There are also additional tokens used to authenticate connections to the X server that are stored in ~/.Xauthority
that you can view with xauth list
.
Now, run ssh -Y 10.10.101.96
. If you get a message like X11 forwarding request failed on channel 0
, then run ssh -v -Y 10.10.101.96
instead to get debugging messages. If the remote machine is a server, the reason will probably be that xauth
isn’t installed. On CentOS, it’s in the xorg-x11-xauth
RPM.
On the remote machine, if everything went well, then $DISPLAY
on the remote machine will now be set to a proxy display set up by SSH:
$ echo $DISPLAY
localhost:10.0
At which point you can run a command like xterm
on the remote machine, and have the window pop up on your local display.
Although there’s no X server running on the remote machine, you may still need to install a bunch of X11 libraries for Java to be able to talk to your local X server…
回答2:
If a JDK is installed on the Windows host, there is no need for using the JVisualVM from the Unix host through XWindow and ssh. It is a perfectly correct solution, but it can be tricky if you are not used to ssh and XWindow DISPLAY, not speaking of cygwin or XMing install ...
The simplest solution in this use case is :
- run jstatd on the Linux host (preferently under same credentials of the app to debug)
- run jvisualvm on the Windows host and ask it to connect to the Linux host
(see docs about jvisualvm and jstatd for further references)
回答3:
I have solved a similar problem. In my case there was an incorrect IP-address specified in /etc/hosts
file for a hostname of server running sshd.
Fortunately java application gave me this more verbose output, while other applications just fails with Failed to open display
message.
来源:https://stackoverflow.com/questions/24153416/java-lang-internalerror-cant-connect-to-x11-window-server-for-jvisualvm-profil