Ubuntu下使用Java visualVM对Java程序进行性能分析

简介:

使用Java visualVM的原因:

  体积小,不耗内存,操作简单,功能全。关于Java visualVM和其他性能测试工具的比较,网上有很多文章,去搜搜看吧。

1. 在服务器上配置jstatd的security policy文件。

  jstatd是一个监控JVM(Java Virtual Machine,Java虚拟机)从创建到销毁过程中资源占用情况,并提供远程监控接口的RMI(Remote Method Invocation,远程方法调用)服务程序,它是一个Deamon程序,要保证远程监控软件连接到本地的话,需要始终保持jstatd运行。jstatd运行需要通过-J-Djava.security.policy=(某个文件的路径名,这个文件指定了安全策略)。因此我们需要在服务器上建立这个文件,文件可随意起名,这里我取名为jstatd.policy。文件内容必须如下:

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

  注意,这里不建议进行复制,建议手敲一遍,避免因为半角和圆角符号导致错误。另外,内容必须如此,否则报错,提示没有权限:

?
1
2
3
4
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"
    at......

2. 修改服务器hosts文件中的IP地址

  要使Java visualVM成功连接到服务器上,服务器端因该在/etc/hosts文件中把本机地址设置为实际的IP地址(比如192.168.3.123),而不是127.0.0.1。可以先使用hostname -i查看,再用vi修改

3. 在用于查看服务器的机器上启动JvisualVM

  1.先安装JvisualVM:

?
1
sudo  apt-get  install  jvisualvm

  2.运行JvisualVM,注意这里需要加上Java的路径:

?
1
jvisualvm --jdkhome ${JAVA_HOME}

  注意:${JAVA_HOME}是指在Ubuntu系统中JDK的环境变量

4. 在服务器上运行jstatd程序

?
1
jstatd -J-Djava.security.policy=jstatd.policy

  注意:这里的jstatd.policy即为刚刚创建的关于安全策略的文件名,还需要指定这个文件的路径,比如:/usr/lib/jstatd.policy

  如果还需要RMI日志功能的话,还可以加上启动参数-J-Djava.rmi.server.logCalls:

?
1
jstatd -J-Djava.security.policy=jstatd.policy -J-Djava.rmi.server.logCalls= true

  之后就可以查看这台服务器上的JVM运行情况了

5. 通过Java JvisualVM连接到服务器

  在Java visualVM程序窗口左侧“远程”项目右键选择“添加远程主机”,在弹出的对话框中输入远程主机的IP地址,确认提交以后可以看到相应的主机和运行在上面的Java程序,连接成功后会显示该主机上运行的Jstatd机器PID。

  通过以上方式连接服务器有一个问题,不能监控服务器的CPU使用情况,提示我们建立JMX,查阅资料发现,可以在服务器启动jstatd加入JMX的参数:

?
1
jstatd -J-Djava.rmi.server. hostname =192.168.3.123  -J-Djava.security.policy=jstatd.policy  -J-Dcom.sun.management.jmxremote.port=4444 -J-Dcom. sum .management.jmxremote.ssl= false   -J-Dcom.sun.management.jmxremote.authenticate= false

  注意:上述脚本为一句,就是一行,不要自行换行,否则不能启动jstatd。其中:

  -J-Djava.rmi.server.hostname表示服务器的地址;

  -J-Djava.security.policy表示使用的安全策略文件路径;

  -J-Dcom.sun.management.jmxremote.port表示暴露服务器JVM给其他机器的端口号;

    -J-Dcom.sum.management.jmxremote.ssl=false表示对RMX传输不加密

  -J-Dcom.sun.management.jmxremote.authenticate=false表示其他机器连接服务器时不需要验证,若为true,则在连接服务器时需要输入密码

  这段脚本会阻塞当前的命令行,如果不想其阻塞,可以在最后打个空格,再加个&符号即可,此时这条命令会被当作作业添加到后台启动:

?
1
jstatd -J-Djava.rmi.server. hostname =192.168.3.123  -J-Djava.security.policy=jstatd.policy  -J-Dcom.sun.management.jmxremote.port=4444 -J-Dcom. sum .management.jmxremote.ssl= false   -J-Dcom.sun.management.jmxremote.authenticate= false  &

  这样启动后怎么停止?请看这里:http://soft.chinabyte.com/os/379/12244379.shtml

  有了上述步骤后,你就可以对远程服务器的JVM了如指掌了。


目录
相关文章
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
1月前
|
SQL Oracle Java
sql文件批处理程序-java桌面应用
sql文件批处理程序-java桌面应用
25 0
|
1月前
|
存储 Java
Java:编写程序,计算两个数的和、差、积、商和余数。docx
Java:编写程序,计算两个数的和、差、积、商和余数。docx
|
1月前
|
安全 Java 数据库连接
【Java每日一题】——第四十一题:编写程序描述影视歌三栖艺人。
【Java每日一题】——第四十一题:编写程序描述影视歌三栖艺人。
24 0
|
7天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
30 3
|
22天前
|
Java
elasticsearch使用java程序添加删除修改
elasticsearch使用java程序添加删除修改
9 0
|
28天前
|
存储 算法 C++
程序性能分析
1. 什么是程序性能 程序性能指的是程序在执行过程中所消耗的时间和资源的多少。一个好的程序应该能够在较短的时间内完成所需的任务,并且尽可能地利用少量的资源。
21 3
|
29天前
|
Java
java程序
re是java运行时的环境,包含jvm和运行时所需要的类库 jdk是java开的程序包,包含jre和开发人员使用的工具 jvm就是我们常说的java虚拟机,他是整个java实现跨平台的最核心 的部分,所有的java程序会首先被编译为.class的类文件,这种类文 件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统 相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释 给本地系统执行。 只有jvm还不能成class的执行,因为再解释class的时候jvm需要调用 解释所需要的类库lib,而jre包含lib类库。jvm屏蔽了与具体操作系 统平台相关的信息,使得java程
16 0
|
1月前
|
安全 Java 数据库连接
【Java每日一题】——第四十二题:编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。可以弹奏的乐器包括二胡、钢琴和琵琶。
【Java每日一题】——第四十二题:编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。可以弹奏的乐器包括二胡、钢琴和琵琶。
58 0
|
1月前
|
Java 知识图谱
【Java每日一题】— —第九题:编写Java程序:通过使用if-else多分支语句,实现从键盘录入一个人的身高和体重后,输出该人的BMI健康体重指数
【Java每日一题】— —第九题:编写Java程序:通过使用if-else多分支语句,实现从键盘录入一个人的身高和体重后,输出该人的BMI健康体重指数
46 0