当监视正在运行的Java应用程序时,JConsole是一个很好的工具。 但是,当无法使用JConsole直接连接到JVM(例如,由于网络限制)并且无法进行SSH隧道传输时,那么拥有命令行版本的JConsole会很棒。

jcmx是JConsole的命令行版本。 下载单个jar文件cjmx_2.10-2.1.0-app.jar ,可以通过将tools.jar包含到类路径中来启动它:

java -cp $JAVA_HOME/lib/tools.jar:cjmx_2.10-2.1.0-app.jar cjmx.Main

这将使用以下基本命令打开“ JMX shell”:

  • help :这会显示一个基本的帮助屏幕,其中说明了可用的命令。
  • jps / list :类似于JDK中的jps工具,此命令将打印出所有Java进程及其进程ID。
  • connect :您可以使用此命令连接到正在运行的JVM进程。
  • format :让您指定是使用简单文本格式还是JSON字符串输出。
  • 退出 :退出应用程序。

要了解有关cjmx的更多信息,让我们开始一个会话并连接到运行cjmx本身的JVM:

> jps
13198 cjmx.Main
> connect 13198
Connected to local virtual machine 13198
Connection id: rmi://0:0:0:0:0:0:0:1  2
Default domain: DefaultDomain
5 domains registered consisting of 19 total MBeans
>
describe     disconnect   exit         format       help         invoke       mbeans       names        names        sample       select       status

在>的最后一个出现之后,您会看到cjmx的一个强大功能:自动完成。 每次您不知道可用的命令时,只需键入[TAB] ,cjmx就会列出它们。 我们将看到,这甚至适用于MBean名称。

现在我们已连接到JVM,可以让cjmx描述可用的MBean。 使用自动完成功能,我们可以开始输入describe '[TAB]来检索所有可用软件包的列表:

> describe '
:                     JMImplementation:     com.sun.management:   java.lang:            java.nio:             java.util.logging:

通过这种方式,我们可以挖掘MBean名称,直到找到所需的内容为止。 在此示例中,我们对MBean'java.lang:type = OperatingSystem'感兴趣:

> describe 'java.lang:type=OperatingSystem'
Object name: java.lang:type=OperatingSystem
-------------------------------------------
Description: Information on the management interface of the MBeanAttributes:MaxFileDescriptorCount: longOpenFileDescriptorCount: longFreePhysicalMemorySize: longCommittedVirtualMemorySize: longFreeSwapSpaceSize: longProcessCpuLoad: doubleProcessCpuTime: longSystemCpuLoad: doubleTotalPhysicalMemorySize: longTotalSwapSpaceSize: longAvailableProcessors: intArch: StringSystemLoadAverage: doubleName: StringVersion: StringObjectName: ObjectName

如我们所见,MBean'java.lang:type = OperatingSystem'提供了有关打开文件数和当前CPU负载等的信息。因此,让我们通过调用名称为的mbeans命令来查询打开文件数。 MBean以及子命令select和MBean的属性:

> mbeans 'java.lang:type=OperatingSystem' select OpenFileDescriptorCount
java.lang:type=OperatingSystem
------------------------------OpenFileDescriptorCount: 35

我们甚至可以使用星号而不是属性的具体名称来查询所有可用属性。 请注意,使用向上光标键可以调出最后发出的命令,因此我们不必再次键入该命令。 相反,我们只是将属性名称替换为星号:

> mbeans 'java.lang:type=OperatingSystem' select *
java.lang:type=OperatingSystem
------------------------------MaxFileDescriptorCount: 10240OpenFileDescriptorCount: 36
...

通过使用子命令invoke我们甚至可以像下面的示例一样调用MBean方法:

> mbeans 'java.lang:type=Memory' invoke gc()
java.lang:type=Memory: null

现在我们知道如何查询属性和调用方法,我们可以开始编写此功能的脚本以监视应用程序。 为了支持这种脚本,cjmx提供了可以将所有“命令”也作为参数传递给应用程序本身的功能,因此您可以通过以下方式调用cjmx(其中<PID>必须由一个具体的过程代替)正在运行的JVM的ID):

java -cp $JAVA_HOME/lib/tools.jar:cjmx_2.10-2.1.0-app.jar cjmx.Main &amp;lt;PID&amp;gt; &amp;quot;mbeans 'java.lang:type=OperatingSystem' select OpenFileDescriptorCount&amp;quot;
java.lang:type=OperatingSystem
------------------------------OpenFileDescriptorCount: 630

有了这些知识,我们可以编写一个简单的bash脚本,该脚本每秒查询JVM以获取打开文件的数量:

#!/bin/bash
while [ true ] ; doecho `date` | tr -d '\n'java -cp /usr/java/default/lib/tools.jar:cjmx_2.10-2.1.0-app.jar cjmx.Main $1 &amp;quot;mbeans 'java.lang:type=OperatingSystem' select OpenFileDescriptorCount&amp;quot;|grep OpenFileDescriptorCount|cut -f 2 -d :sleep 1
done

这会每秒产生一个带有时间戳和当前打开文件数的新行。 当重定向到文件中时,我们有一个简单的日志文件,以后可以对其进行评估。

结论 :当由于服务器计算机上的网络限制而无法使用JConsole时, cjmx是JConsole的绝佳替代品。 通过在命令行上传递命令来发出命令的能力使其适合于小型监视脚本。

翻译自: https://www.javacodegeeks.com/2014/12/cjmx-a-command-line-version-of-jconsole.html

cjmx:JConsole的命令行版本相关推荐

  1. python 桌面歌词_GitHub - Python-Z/musicbox: 网易云音乐命令行版本

    NetEase-MusicBox 感谢为 MusicBox 的开发付出过努力的每一个人! 高品质网易云音乐命令行版本,简洁优雅,丝般顺滑,基于Python编写. 功能特性 320kbps的高品质音乐 ...

  2. Python命令行版本的员工管理系统

    # 练习 # - 做命令行版本的员工管理系统 # - 功能: # 四个: # 1.查询 # - 显示当前系统当中的所有员工 # 2.添加 # - 将员工添加到当前系统中 # 3.删除 # - 将员工从 ...

  3. python生词本查单词译文_GitHub - To-knowledge/Wudao-dict: 有道词典的命令行版本,支持英汉互查和在线查询。...

    无道词典 无道词典,是一个简洁优雅的有道词典命令行版本.支持英汉互查的功能,包含释义.词组.例句等有助于学习的内容. 无道词典致力于做最好的命令行词典,随着我们优化排版.显示,增加生词本和补全功能,提 ...

  4. python登陆百度网盘_百度网盘命令行版本bypy

    表白:黑白圣堂血天使,天剑鬼刀阿修罗. 讲解对象:/百度网盘命令行版本bypy作者:融水公子 rsgz百度网盘教程 http://www.rsgz.top/post/399.html为了大家可以在co ...

  5. 使用 7-Zip 的命令行版本来压缩和解压文件

    7-Zip 也有一个简短的名称 7z.它的原生 UI 确实不怎么好看,非常有年代感:不过 7-Zip 的强大之处不在于 UI,而在于其算法和各种文件的支持情况.不过,7-Zip 提供了命令行的版本,让 ...

  6. linux网易云命令行,网易云音乐还有命令行版本?倒适合部署在Linux系统的机器人上...

    平时工作或生活喜欢有点音乐陪伴.而网易云音乐是一直以来用的音乐播放软件,可能除了里面很多懂你推给你的好音乐外,它还是一个分享和温暖的社区,分享评论,分享故事和温暖.机智客自己不管是PC电脑端还是移动手 ...

  7. linux 命令行x,向日葵X for Linux Terminal 使用教程(命令行版本)

    若下载的是图形版本,请点击这查看详细操作步骤:使用教程. 一.下载 1.Oray官网首页,点击向日葵进入子站,在上方栏目点击"下载",选择"Linux"后再次点 ...

  8. tassel软件使用linux,Tassel 命令行版本使用笔记

    1. 常见的基因型数据格式 1.1 Hapmap 数据格式 1 2 3 4 5 6 7 8 9 10 11 12 rs# alleles chrom pos strand assembly# cent ...

  9. upx命令行版本脱壳全过程

    这是一个需要脱壳的文件,可以看到是加了upx壳的. 首先打开cmd命令行. 然后进入upx.exe所在的目录. 代码如下: dir查看upx文件夹 可以看到upx.exe,启动它. 出现这样的界面就可 ...

最新文章

  1. [LeetCode] Restore IP Addresses 复原IP地址
  2. shell排序-c语言
  3. Spring mvc 注解@ResponseBody 返回内容编码问题
  4. IP大时代下,网络枪机技术发展现状
  5. vue 开发环境搭建
  6. VC++实现混合静态分裂视窗的方法
  7. c# 客户端 服务器传输文件,通过TCP在C++客户端/ C#服务器之间传输文件
  8. c++遍历文件夹下的文件_算法面试|开发者必备|使用递归函数进行无限分类及文件夹遍历...
  9. Bailian2798 2进制转化为16进制【进制】
  10. Residual Attention Network--2017-【论文理解】
  11. Eclipse中使用google代码风格
  12. html语言的前景,HTML5语言的优势有哪些?2021年还有前景么?
  13. 【UVA1339】古老的密码(巧妙思路+(q)sort降序排列的三种方法)
  14. 操作系统实验Lab 2:system calls(MIT 6.S081 FALL 2020)
  15. 更多:Racket系统编程
  16. 什么是 ETL ?什么是 ELT ?
  17. 原来Oracle也不喜欢“蜀黍(r6笔记第54天)
  18. 大众点评的大数据实践
  19. win10 如何在防火墙开放端口
  20. GIF动态图怎么制作?试试这些简单方便的制作方法

热门文章

  1. Java中数组的赋值方式
  2. C语言调用es6,ES6 箭头函数、普通函数、调用方法
  3. 四种常见的 POST 提交数据方式对应的content-type取值
  4. php 错误提示开启,php开启与关闭错误提示,php开启错误提示_PHP教程
  5. 如何设置电脑自动锁屏_这个手机锁屏密码竟可以根据时间而变化!密码每分钟都会发生改变...
  6. ReviewForJob——堆排序
  7. 动态资源Servlet接口
  8. openjdk-7支持版本_长期支持对OpenJDK意味着什么?
  9. stripe pay_J2Pay –完整示例
  10. jdk 流合并_JDK 12,合并的收集器和命名的挑战