一、准备工作

linux安装好JDK、检测的应用等环境

二、准备工具

一般服务器是linux,没有可视化界面,故需要提供远程的配置,给远程机器进行分析,工具名:jstatd。装好了JDK,默认有该工具。默认是在安装包目录的/bin目录下

三、配置

1、确定jdk运行目录

若是确定jdk运行目录,建议使用命令查询下

which java

2、创建文件

在jstatd同级目录下创建文件jstatd.all.policy

grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};

四、启动

上述配置好后,改下IP,运行下面命令即可,

./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.110.88 &

其中192.168.110.88是我的服务器IP

五、连接

在windows系统中java安装目录中jdk/bin/目录下的jvisualvm.exe启动程序。双击启动。

企业微信截图_17206024388412.png

输入IP即可,不需要端口

六、可能出现问题

运行命令出错

./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.110.88 &

错误提示:

/usr/local/jdk1.8.0_321/bin/jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=172.16.120.12
Could not create remote object
access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:886)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.System.setProperty(System.java:792)
    at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)

解决办法解决办法:
修改jdk安装目录下的/jre/lib/security/java.policy文件,并在最后增加如下内容:

//添加下面内容
permission java.security.AllPermission;

完整文件内容

// Standard extensions get all permissions by default
​
grant codeBase "file:${{java.ext.dirs}}/*" {
        permission java.security.AllPermission;
};
​
// default permissions granted to all domains
​
grant {
        // Allows any thread to stop itself using the java.lang.Thread.stop()
        // method that takes no argument.
        // Note that this permission is granted by default only to remain
        // backwards compatible.
        // It is strongly recommended that you either remove this permission
        // from this policy file or further restrict it to code sources
        // that you specify, because Thread.stop() is potentially unsafe.
        // See the API specification of java.lang.Thread.stop() for more
        // information.
        permission java.lang.RuntimePermission "stopThread";
​
        // allows anyone to listen on dynamic ports
        permission java.net.SocketPermission "localhost:0", "listen";
​
        // "standard" properies that can be read by anyone
​
        permission java.util.PropertyPermission "java.version", "read";
        permission java.util.PropertyPermission "java.vendor", "read";
        permission java.util.PropertyPermission "java.vendor.url", "read";
        permission java.util.PropertyPermission "java.class.version", "read";
        permission java.util.PropertyPermission "os.name", "read";
        permission java.util.PropertyPermission "os.version", "read";
        permission java.util.PropertyPermission "os.arch", "read";
        permission java.util.PropertyPermission "file.separator", "read";
        permission java.util.PropertyPermission "path.separator", "read";
        permission java.util.PropertyPermission "line.separator", "read";
​
        permission java.util.PropertyPermission "java.specification.version", "read";
        permission java.util.PropertyPermission "java.specification.vendor", "read";
        permission java.util.PropertyPermission "java.specification.name", "read";
​
        permission java.util.PropertyPermission "java.vm.specification.version", "read";
        permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
        permission java.util.PropertyPermission "java.vm.specification.name", "read";
        permission java.util.PropertyPermission "java.vm.version", "read";
        permission java.util.PropertyPermission "java.vm.vendor", "read";
        permission java.util.PropertyPermission "java.vm.name", "read";
        //添加下面内容
        permission java.security.AllPermission;
};