• jvisualvm连接远程应用终于成功,附踩大坑记录!!(一:jstatd方式)


    一、问题概述

    连接远程java应用除了jstatd方式,还有jmx方式。不必拘泥于一种,一种不行可以果断尝试另一种,兴许就行了。

    姊妹篇在这:

    jvisualvm连接远程应用终于成功,附踩大坑记录!!(二:jmx方式)

     

    目前,在jvisualvm连接失败的相关互联网博客中,我还没看到有人和我一样的解决方法。

    两天前,我像大家一样,在网络上搜索jvisualvm连接remote 应用的方法,然而,不知道为啥,我的开发机器的visualvm真就连不上远程主机上的应用。

    试了同事电脑,试了改端口,试了wireshark抓包,(主要是看连接建立了没,我这边的现象是:地址应该没问题,不是网上很多博客说的hostname的问题,在本机向远程机器上的jstatd

    发起连接请求后,没一会就被服务器端发了fin信号过来,把连接断开了;看下图,可以发现,有相当多的fin标志的消息)

    总之,我试了不少办法。后来才觉得可能本机的visualvm工具有问题(或者我本机环境有问题),后来我又试了同事电脑,也不行;后来没法,只好试试开发用的服务器了(有一台windows server 2016的),结果,就成了。具体看下文吧。

    jvisualvm连接远程应用主要有两种方式,一种是jstatd方式,这种的话,不需要应用预先设置jmx之类的参数,个人认为比较适合:远程服务器上的需要分析的java程序已经很慢,不响应了,连不上了,这时候就可以启动一个jstatd应用,供client主机连接;

    一种是需要java应用启动前,就设置jmx相关的参数,当应用变慢时,就可以用jvisualvm连上去,分析原因。

    二、操作步骤之jstatd方式

    1、创建文件jstatd.all.policy

    我是在jdk目录下的bin创建的,不在这应该也没关系。

    [root@pas bin]# pwd
    /usr/local/jdk1.8.0_161/bin

    内容如下:(和网络上的很多博客不一样,我这边指定了绝对路径,没采用java.home,主要是我踩坑的时候,方便排除路径方面的影响)

    grant codebase "file:/usr/local/jdk1.8.0_161/lib/tools.jar" {  
       permission java.security.AllPermission;  
    }; 

    2、启动jstatd后台应用

    命令如下:

    jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.19.114 -J-Djava.rmi.server.logCalls=true

    (我是在/usr/local/jdk1.8.0_161/bin路径下运行的下面的命令,该路径下就有jstatd.all.policy文件。如果是在其他地方执行,记得指定绝对或相对路径)

    其中,

    -J-Djava.security.policy=jstatd.all.policy 指定路径
    -J-Djava.rmi.server.logCalls=true  打印日志
    -J-Djava.rmi.server.hostname=192.168.19.114  指定主机名,主机名应该和你用hostname -i命令执行出来的结果一致。

    然后,我的/etc/hosts文件的内容如下:
    [root@pas bin]# less /etc/hosts
    192.168.19.114   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

    不过,网络上都说改了/etc/hosts中的127.0.0.1为自己的ip地址后,执行hostname -i的结果,就会是自己在/etc/hosts中设置的ip地址,然而,我的不是这样:

    其中的红圈是我的ip地址:

    ps:如需要修改端口(默认为1099):

    jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.19.114 -J-Djava.rmi.server.logCalls=true -J-Djava.net.preferIPv4Stack=true -p 5555
    其中:
    -p 5555 ----------修改端口为5555

    3、启动后效果

    [root@pas bin]# jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.19.114 -J-Djava.rmi.server.logCalls=true
    Jun 27, 2018 4:20:03 PM sun.rmi.server.UnicastServerRef logCall
    FINER: RMI TCP Connection(1)-192.168.19.114: [192.168.19.114: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
    Jun 27, 2018 4:20:03 PM sun.rmi.server.UnicastServerRef logCall
    FINER: RMI TCP Connection(2)-192.168.19.114: [192.168.19.114: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]

    4、客户端连接-本机连接

    注意到了吗,连接后,没有半点反应。

    和网络上那些顺风顺水的宝宝们比起来,是不是很心累。。。我的为啥不行。不要急。我们换台电脑。

    4、客户端连接-其他主机进行连接

     在我翻遍了互联网上上百个网页后,几乎要放弃的时候,我决定再试试。

    换了台电脑,一台开发用的服务器,系统是windows server 2016,装的jdk版本是jdk-8u121-windows-x64

    三、结论

    遇到bug时,可以尝试换台电脑吧。。。不过,你也不用瞎换。

    经过我的尝试,我找到了一个稳定的组合,保证可以连上。

    1、安装win7虚拟机

    我在我的vmvare里,安装了一台虚拟机(win7 64位),镜像用的是下面这个(复制到迅雷下载):

    ed2k://|file|cn_windows_7_ultimate_x64_dvd_x15-66043.iso|3341268992|7DD7FA757CE6D2DB78B6901F81A6907A|/

    原始网站在这:

    https://msdn.itellyou.cn/

    2、安装java

    我用的是下面这个版本:

    jdk-8u121-windows-x64.exe

    3、试试visualvm吧,应该可以了

    以上。

  • 相关阅读:
    Html语言基础
    acm练习(四)
    acm练习(三)
    acm练习(二)
    acm练习(一)
    android自定义控件属性
    android ViewGroup getChildDrawingOrder与 isChildrenDrawingOrderEnabled()
    java 用Arrays.binarySearch解读 快速定位数字范围
    android极光推送初步了解...
    GridView与ListView冲突
  • 原文地址:https://www.cnblogs.com/grey-wolf/p/9234780.html
Copyright © 2020-2023  润新知