JVM问题排查也不是很难

Stella981
• 阅读 600

目录

  • 概述
  • 环境准备
  • 工具介绍
  • 远程连接方式
  • 开启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

点赞
收藏
评论区
推荐文章
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
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年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这