• 橘子学JVM之命令行监控01之jps


    一、命令行工具

    2.1. 概述

    性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。

    Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。

    体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。
    体会2:无监控、不调优!
    简单命令行工具

    在我们刚接触java学习的时候,大家肯定最先了解的两个命令就是javac,java,那么除此之外,还有没有其他的命令可以供我们使用呢?

    我们进入到安装jdk的bin目录,发现还有一系列辅助工具。这些辅助工具用来获取目标 JVM 不同方面、不同层次的信息,帮助开发人员很好地解决Java应用程序的一些疑难杂症。
    在windows下面这些指令都位于jdk的安装目录下面,
    在这里插入图片描述
    这些指令都是运行的应用程序代码,这个代码的位置就是你jdk下面的tools的压缩包但是都是编译好的字节码。
    其源码的官方地址是:http://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.jcmd/share/classes/sun/tools

    二、JPS

    1、基础概念

    该命令的作用是列出所有的jvm的进程。
    jps(Java Process Status):显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
    说明:对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。
    基本使用语法为:jps [options] [hostid],这个可以用jps -help查看具体的参数。
    我们还可以通过追加参数,来打印额外的信息。

    # options参数
    
    ● -q:仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等
    ● -l:输出应用程序主类的全类名 或 如果进程执行的是jar包,则输出jar完整路径
    ● -m:输出虚拟机进程启动时传递给主类main()的参数
    ● -v:列出虚拟机进程启动时的JVM参数。比如:-Xms20m -Xmx50m是启动程序指定的jvm参数。
    
    说明:以上参数可以综合使用。
    
    补充:如果某 Java 进程关闭了默认开启的UsePerfData参数(即使用参数-XX:-UsePerfData),那么jps命令(以及下面介绍的jstat)将无法探知该Java 进程。
    
    # hostid参数
    
    RMI注册表中注册的主机名。如果想要远程监控主机上的 java 程序,需要安装 jstatd。
    
    对于具有更严格的安全实践的网络场所而言,可能使用一个自定义的策略文件来显示对特定的可信主机或网络的访问,尽管这种技术容易受到IP地址欺诈攻击。
    
    如果安全问题无法使用一个定制的策略文件来处理,那么最安全的操作是不运行jstatd服务器,而是在本地使用jstat和jps工具。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2、实际操作

    我们先写个程序:

    package com.lyx.cmd;
    
    /**
     * @author: levi
     * @description: TODO
     * @date: 2022-10-1 20:07
     * @version: 1.0
     */
    public class TestJps {
        public static void main(String[] args) {
            try {
            	// 休眠很长时间,方便我们观察这个程序 
                Thread.sleep(10000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    1、jps

    我们运行这个程序,然后进入cmd窗口,输入这个命令。
    在这里插入图片描述
    看到我们那个TestJps的程序的进程号是61976。
    我们同时看到Jps本身也占一个进程,也有一个自己的进程号。这就是你这次监控jvm线程本身这个jps的程序,你下次再启动又是另一个了。
    除此之外还有一些jvm后台启动的守护线程。

    2、jps -q

    仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等
    现在我们带着第一个参数-q执行一次监控。
    在这里插入图片描述
    我们看到他只输出了进程号,没有把进程的名字输出来,所以这个是一个精简的指令,可以说是狗都不用了。
    -q的意思带着点quit的意思,就是退出,先这么理解吧。

    3、jps -l
    l理解可以成为linux的ll这种列出来列表的东西

    输出应用程序主类的全类名 或 如果进程执行的是jar包,则输出jar完整路径
    在这里插入图片描述
    我们看到他直接把类的全路径都给输出了。

    4、jps -m
    -m我理解就是more更多信息的意思

    输出虚拟机进程启动时传递给主类main()的参数.
    每一个进程都能传递参数,你启动jar的时候可以外部传递一些参数。
    你启动main的时候也能传递一些参数,包括你本身执行jps的时候-l -m 本身就是参数,你-m的时候就会输出这个,我们测试一下。
    在这里插入图片描述
    在这里设置进去。
    在这里插入图片描述
    启动程序,执行jps -m
    输出的太多了,cmd不好看了,我们输出到文件里面去。
    在这里插入图片描述
    输出到D盘下面的1.txt里面,你要是不指定路径就是默认当前路径下面。可以看到你执行命令时候的参数都能输出来了。
    在这里插入图片描述

    5、jps -v

    列出虚拟机进程启动时的JVM参数。比如:-Xms20m -Xmx50m是启动程序指定的jvm参数。
    我们在这个程序指定一下jvm启动参数。设置一下堆大小。
    在这里插入图片描述
    执行jps -v我们能看到对应的jvm参数都输出了。
    在这里插入图片描述
    在这里插入图片描述
    这些参数可以综合起来一起用,就是各自生效各自的。这个没问题。类似jps -l -m这种
    但是-q是精简的,其余几个是详细的,有点互斥的意思,所以这个-q和其余几个一起用的时候-q生效,-q最狠。
    在这里插入图片描述
    因为你-help 的时候能看出来
    在这里插入图片描述
    如果你的jvm参数配置了-XX:-UsePerfData,你的jps是看不到这个进程的。我就不测试了。

    6、访问远程的服务的操作,基本没啥用处,等用到了可以试试。
    这里提供一个博客,可以参考着试试、

    [jps访问远程][https://www.jianshu.com/p/a96a8f4088ce?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation]

  • 相关阅读:
    OpenFeign
    数字孪生、AR和VR如何改进数据中心设计
    vue开发测评系统思路及踩坑
    深入理解Epoll是如何实现IO多路复用的,值得收藏
    【JavaEE---复习】四、事务
    C++之旅(学习笔记)第8章 概念和泛型编程
    CS5801 HDMI转4K 4lane_DP/eDP方案
    冒泡排序详细详解
    基于SpringBoot的共享单车管理系统
    图解LeetCode——6. Z 字形变换(难度:中等)
  • 原文地址:https://blog.csdn.net/liuwenqiang1314/article/details/127137006