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..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
:: 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
其中:
-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 , :: PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection()-192.168.19.114: [192.168.19.114: sun.rmi.registry.RegistryImpl[::, ]: void rebind(java.lang.String, java.rmi.Remote)]
Jun , :: PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection()-192.168.19.114: [192.168.19.114: sun.rmi.transport.DGCImpl[::, ]: 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|/
原始网站在这:

2、安装java
我用的是下面这个版本:
jdk-8u121-windows-x64.exe
3、试试visualvm吧,应该可以了
以上。
jvisualvm连接远程应用终于成功,附踩大坑记录!!(一:jstatd方式)的更多相关文章
- jvisualvm连接远程应用终于成功,附踩大坑记录!!(二:jmx方式)
一.问题概述 参考前一篇: jvisualvm连接远程应用终于成功,附踩大坑记录!!(一:jstatd方式) 这篇主要讲讲jmx方式. 二.启动前设置jmx参数 我这边拿tomcat举例,其余java ...
- VUE使用微信JDK(附踩坑记录)
VUE使用微信分享SDK(附踩坑记录) 微信分享官方文档 安装JS-SDK npm i -S weixin-jsapi 引入包 ES5 写法 const wx = require('weixin-js ...
- 我用EasyExcel优化了公司的导出(附踩坑记录)
背景介绍 最近要改一个导出的功能,在原有的基础上,在导出一份明细数据,要求导出内容加在原有 excel 的第二个 sheet 上.考虑到数据量还比较大,干脆引入阿里的 EasyExcel 来做. 下面 ...
- 用JvisualVM监视远程tomcat
在tomcat的catcalina.sh 中java_opts 环境变量中添加以下参数: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmx ...
- jvisualvm_使用jmx连接远程linux应用
[前提] JVisualVM是由Sun提供的性能分析工具,在Jdk6.0以后的版本中是自带的,如果是用Jdk1.5或以前版本的就得要单独安装了. [1]远程机器需要开启jmx 在使用jvisualvm ...
- jvisualvm_使用jstatd连接远程linux应用
[1]确定linux系统正确安装了ssh # sudo ps -e | grep ssh ①注意使用root,使用$会报如下错误: [appadmin@webcsuat2 ~]$ sudo ps -e ...
- jvisualvm 连接 jstatd 远程监控 jvm 或 Visual GC提示"不受此JVM支持“
Visual GC提示"不受此JVM支持",可以使用此方法解决. 一.添加配置文件 jstatd.all.policy [root@localhost /]# cd /usr/lo ...
- VS连接远程数据库,连接sqlserver2008,显示“基础提供程序在 Open 上失败”
今天安装完成VS2012后,在调试2010的程序的时候,出现“基础提供程序在 Open 上失败”,于是用vs连接远程sql2008,才发现问题是:“已成功与服务器连接,但是登录前的握手期间发生错误”, ...
- Jvisualvm监控远程linux下Tomcat
Jvisualvm监控远程linux下Tomcat 1.编辑tomcat/bin/catalina.sh 加入下面这段代码,中间无换行: CATALINA_OPTS="$CATALINA_O ...
随机推荐
- mysql replace into用法详细说明
From: http://www.cnblogs.com/martin1009/archive/2012/10/08/2714858.html REPLACE的运行与INSERT很相似.只有一点例外, ...
- LNMP架构介绍 MySQL安装 PHP安装 Nginx介绍
- js Object.prototype.toString.call()
Object.prototype.toString.call(obj)使用方法以及原理 这几天看vue-router的源码 发现了Object.prototype.toString.call()这 ...
- UNIX环境编程学习笔记(16)——进程管理之进程环境变量
lienhua342014-10-03 1 环境表和环境指针 在每个进程启动时,都会接到一张环境表.环境表是一个字符指针数组,其中每个指针包含一个以 null 结束的 C 字符串的地址.全局变量env ...
- 【转】ZooKeeper详细介绍和使用第一节
一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的 ...
- JSP输出当前日期
如何在网页中动态交互,输出当前日期? <%@ page language="java" import="java.util.*" contentType= ...
- 06-Linux RPM 命令参数使用详解
rpm 执行安装包二进制包(Binary)以及源代码包(Source)两种.二进制包可以直接安装在计算机中,而源代码包将会由 RPM自动编译.安装.源代码包经常以src.rpm作为后缀名. 常用命令组 ...
- 5 -- Hibernate的基本用法 --1 ORM和Hibernate
目前流行的编程语言,如Java.C#等,它们都是面向对象的编程语言,而目前铸就的数据库产品,例如Oracle.DB2等,依然是关系数据库等.编程语言和底层数据库的发展不协调,催生出了ORM框架.ORM ...
- SpringMVC -- 梗概--源码--壹--数据传递
附:实体类 Class : User package com.c61.entity; import java.text.SimpleDateFormat; import java.util.Date; ...
- Java 代码块:静态代码块、构造代码块、构造函数块
Class : StaticFa package edu.bai.du.lime.staticCode; public class StaticFa { // 随着类的声明而执行 static { S ...