我正在尝试配置远程Java应用程序,实际上它是一个游戏服务器。它在我的本地机器上运行(Windows XP x64与JDK1.7.0_02 x64),但在生产服务器(带有JDK1.7.0_03 i586的CentOS)上表现得非常糟糕。
我做了很多搜索,发现我应该使用VisualVM来完成这项任务。所以VisualVM在本地机器上工作得很好,但是在本地机器上没有挂起,我需要在具有真实有效负载的生产环境中进行分析。我在带有参数
的远程机器上启动了jstatdjstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=false &
使用政策文件
grant codebase "file:/usr/java/jdk1.7.0_02/lib/tools.jar" {
permission java.security.AllPermission;
};
然后我就像这样开始了我的java应用程序
java -server -Dcom.sun.management.jmxremote\
-Dcom.sun.management.jmxremote.port=4000\
-Dcom.sun.management.jmxremote.ssl=false\
-Dcom.sun.management.jmxremote.authenticate=false\
-jar /home/pinballSocketServer/pinballSocketServer.jar
应用程序和jstatd都以root priveledges启动。
并且VisualVM无法连接到远程主机。但是在远程主机上,我看到以下日志,而VisualVM正在运行并添加了远程主机:
Feb 16, 2012 7:11:52 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:11:56 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:12:00 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:12:04 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
进一步谷歌搜索后,我发现我需要使用ssh隧道。我按照以下方式配置了putty
http://www.advancedigital.ru/show/putty_config.jpg
和VisualVM就是这个
http://www.advancedigital.ru/show/visualvm_config.jpg
VisualVM上方的Adter munipulations连接到远程主机,但我只能看到线程摘要图表和分析器处于非活动状态。
我已经看到一些建议,两台机器上的jvms应该是相似的并且具有相同的平台(x86或x64),但我已经尝试从另一台机器(带有JDK1.7.0_03 x86的Windows 7 x86)进行分析,并且有相同的结果。
我也试过这个,但又得到了相同的结果。 VisualVM over ssh
如何让这种分析工作?
答案 0 :(得分:2)
请注意,如果服务器安装了X11库,则可以远程运行JVisualVM ,只需让Putty将X11连接转发到本地计算机上运行的X11服务器。
如果您没有可用的X11服务器,Xming - http://www.straightrunning.com/XmingNotes/ - 可以正常工作。如果您的计算机是安全的,您可以在没有访问控制的情况下运行,从而更容易启动和运行。
请注意,X11通信非常冗长。使用“blowfish”-cypher并要求压缩。
答案 1 :(得分:2)
尽管已经回答了这个问题,但我设法做到了,所以我将添加我的方法:
我使用了以下来源:
https://bowerstudios.com/node/731
我是在使用带有ssh命令的git bash在windows中完成的。你也可以使用cygwin或pure minggw。
1)在命令提示符下运行ssh tunnel命令(我在git bash / MINGGW32中执行此操作)。
ssh -D 9010 -p 22 root@IP -v
2)使用JMX选项(一个班轮)在服务器上运行您的应用程序
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false -jar application.jar
3)通过socks代理运行visualVM连接(一个班轮)
visualvm -J-Dnetbeans.system_socks_proxy=localhost:9010
-J-Djava.net.useSystemProxies=true
4)实际在visualVM中添加JMX远程连接
同样可用:http://maythesource.com/2013/12/04/connecting-to-jmx-from-visualvm-using-ssh-tunnel/(随着时间的推移会更新更多信息)。
答案 2 :(得分:-1)
我将从调试jstatd连接开始,稍后再保留JMX连接。从你写的不清楚为什么你应该使用ssh隧道。您的远程主机上是否有防火墙,或者为什么您认为需要使用ssh隧道。 还有一点需要注意 - 两台机器上的jvms应该是相似的,并且具有相同的平台(x86或x64)。