JVM问题排查也不是很难

Stella981
• 阅读 336

目录

  • 概述
  • 环境准备
  • 工具介绍
  • 远程连接方式
  • 开启JMX
  • 工具远程连接
  • 参考文献

概述

    线上环境中,程序越来越慢,一头雾水?遇到程序经常宕机,但找不到原因?排查问题却经常记不住命令? 那是没找到好的方法而已,本文将介绍一下JVM问题排查工具的使用, 工具仅仅是工具,还是需要知道一些JVM知识才可以看懂工具中的参数哟..

 转帖请注明原贴地址: https://my.oschina.net/u/2342969/blog/2987769

环境准备

  • centos 7
  • JDK1.8(6 or 7)
  • 可运行java应用

工具介绍

    jdk自带的可视化排查工具有jconsole和jvisualvm两个,两款工具各有千秋,下面简单说一下博主对两款工具的选择

  • 查看线程死锁问题优先选用的jconsole, why? 因为它有一个检查死锁的按钮可以操作.
  • 堆和线程dump选用的jvisualVM,why? 因为它有对应功能的按钮可以点击
  • 其他场景均使用的jvisualVM

注意:它们均位于 ${JAVA_HOME}/bin 下面

远程连接方式

    由于线上服务器是没有可视化界面的,使用可视化工具是没有任何效果的,基本是本地启动工具,远程监控服务器的jvm。

酱紫就会涉及到如何远程连接jvm,远程连接的方式有两种,jstatd和jmx。本文将只介绍jmx连接方式,因为jstatd连接会有权限问题,有一些功能无法正常使用

开启JMX

    现在java应用基本spring boot大一统,下面将介绍一下spring boot应用采用JMX远程监控JVM的方式。

一般spring boot应用启动命令如下(线上肯定需要配一些jvm参数,这里不再赘述):

java -Xms500m -Xmx1024m -jar /opt/spring-boot-test.jar --Dspring.profiles.active=test --Dserver.port=8181

启动jmx的启动方式如下:

java -Xms500m -Xmx1024m -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar /opt/spring-boot-test.jar --Dspring.profiles.active=test --Dserver.port=8181

-Dcom.sun.management.jmxremote.port: jmx远程端口

-Dcom.sun.management.jmxremote.ssl: 是否开启ssl认证

-Dcom.sun.management.jmxremote.authenticate:是否开启ssl认证

本文仅仅简单演示,如需更多安全配置,请查阅参考文献

注意:这样子开启后,仍然会无法连接

远程连接时会报错: 无法使用 service:jmx:rmi:///jndi/rmi://192.168.1.104:3333/jmxrmi 连接到 172.16.0.140:3333

报错原因是:jmx除了远程端口外,还监听了其他端口,通过命令查看其他监听端口

查看应用进程号:

#ps aux|grep spring-boot-test

根据应用进程号,查看监听端口

#netstat -antup|grep <pid>

JVM问题排查也不是很难

如图可以看到,除了远程端口3333外,还监听了40639和36677两个端口, 所以需要开放这两个端口,本文使用的centos 7 默认防火墙使用的firewalld,其他防火墙自行查阅资料开启端口

#firewall-cmd --zone=public --add-port=40639/tcp --permanent
#firewall-cmd --zone=public --add-port=36677/tcp --permanent
#firewall-cmd --zone=public --add-port=3333/tcp --permanent
#firewall-cmd --reload

工具远程连接

jconsole远程连接

启动jconsole

#${JAVA_HOME}/bin/jconsole

JVM问题排查也不是很难

点击连接,正常连接了就会出现下图,如未正常出现,再详细对比上面步骤

JVM问题排查也不是很难

jvisualvm远程连接

启动jvisualvm

#${JAVA_HOME}/bin/jvisualvm

JVM问题排查也不是很难

正常启动就会出现上图,下面开始进行远程连接

JVM问题排查也不是很难

添加JMX远程连接

JVM问题排查也不是很难

JVM问题排查也不是很难

JVM问题排查也不是很难

进入此页面点击监控就可以看到JVM活动情况,如未出现监控信息,请根据以上步骤依次排查

参考文献

文献来自oracle官网java文档,地址随时可能变化哟

https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/applications\_remote.html

https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/jmx\_connections.html

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
5个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。languageJavaScript"name":"vuecliversion2","version":"1.0.0","desc
blmius blmius
1年前
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
技术小男生 技术小男生
5个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
5个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
刚刚好 刚刚好
5个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
晴空闲云 晴空闲云
5个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
5个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
NVIDIA安培架构下MIG技术分析
关键词:NVIDIA、MIG、安培一什么是MIG2020年5月,NVIDIA发布了最新的GPU架构:安培,以及基于安培架构的最新的GPU:A100。安培提供了许多新的特性,MIG是其中一项非常重要的新特性。MIG的全名是MultiInstanceGPU。NVIDIA安培架构中的MIG模式可以在A100GPU上并行运行七个作业。多实
helloworld_28799839 helloworld_28799839
5个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue
helloworld_34035044 helloworld_34035044
8个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为