Java问题定位系列——工具篇Java VisualVM

逻辑漫游
• 阅读 2842

JVisualVM除了可以方便监控本地Java应用外,也支持通过Remote节点远程监控Java进程。这样可以利用可视化界面更高效率地监控生产环境,定位CPU或者内存问题。

VisualVM连接远程节点有2种方式:jstatd和jmx。其中jstatd仅支持monitor,jmx才能支持threads和sampler。下面分别详细讲解。

一、Jstatd连接方式

在远程主机上启动Jstatd,需要先配置权限,否则会报如下security错误:

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:884)
    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)

因此先在$JAVA_HOME/bin下创建一个jstatd.all.policy文件。内容如下:

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

注意:Java9之后的版本不存在文件tools.jar,据说按如下配置可行(本人未验证,请自行研究哈):

grant codebase "jrt:/jdk.jstatd" {
   permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat" {    
   permission java.security.AllPermission;    
};

然后在$JAVA_HOME/bin下下启动jstatd:

jstatd -J-Djava.security.policy=jstatd.all.policy

在本地JVisualVM客户端上Remote下添加节点:
Java问题定位系列——工具篇Java VisualVM

接下来选择对应的java进程就可以进行监控了。不过jstatd模式下,只能使用简单的Monitor,无法使用Sampler功能。如需Sampler,需使用JMX方式连接。

以下为Monitor截图:
Java问题定位系列——工具篇Java VisualVM

二、JMX连接方式

JMX即Java virtual machine,是Java自带的开箱即用的管理工具和接口。

The Java virtual machine (Java VM) has built-in instrumentation that enables you to monitor and manage it using the Java Management Extensions (JMX) technology. These built-in management utilities are often referred to as out-of-the-box management tools for the Java VM. You can also monitor any appropriately instrumented applications using the JMX API.

在远程主机启动应用程序的时候增加jmx配置,如下:

java -Djava.rmi.server.hostname=ttg12 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false HelloWorld

注意:这种不需要验证的方式不安全!只用作测试,均不能用于外网可访问的生产环境!如何设置安全连接,请参考官方文档“Using Password Authentication"章节。

如果Java应用已经启动,且未在启动命令中启动JMX,那么可以通过诊断命令ManagementAgent.start来代理。具体使用方法和各类flags可使用jcmd <pid> help ManagementAgent.start查看。更多jcmd细节,参考官方文档
启动示例:

faceless@ttg12:~/tmp$ jcmd 26548 ManagementAgent.start jmxremote.host=ttg12 jmxremote.port=9999 jmxremote.rmi.port=9999 jmxremote.ssl=false jmxremote.authenticate=false
26548:
Command executed successfully

再多说一句,官方推荐尽量在启动应用的时候就开启JMX,因为JMX不会给应用带来任何负担,但却可以为后面的监控和问题定位带来极大的便利。著名的消息队列RocketMQ就是通过JMX提供监控和管理接口。

Set up JMC JMX for remote monitoring: JMX can be used to connect to a Java application remotely using tools such as Mission Control or Visual VM. Unless you can run these tools on the same machine that is running your application, setting this up can be helpful later on to monitor the application, send diagnostic commands, manage flight recordings and so on. There is no performance overhead in enabling JMX.

来源:Enable Options/Flags for JVM Troubleshooting第6点。

在VisualVM客户端增加JMX连接远程主机:
Java问题定位系列——工具篇Java VisualVM

填入主机和端口号,勾选不使用ssl:
Java问题定位系列——工具篇Java VisualVM

OK,现在除了Monitor之外,还可以监控线程和使用Sampler了。

Threads界面如下图:
Java问题定位系列——工具篇Java VisualVM

Sampler界面如下图:
Java问题定位系列——工具篇Java VisualVM

本文运行环境:
java:oracle jdk 8
server os:ubuntu 18.04
client os:macos 10.15.5

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。