zoukankan      html  css  js  c++  java
  • Jdk内置的常用工具使用大全

    前言

    此博文以jdk11中bin命令为准,旧版本被移除的命令不再介绍
    jdk的bin目录下面有许多命令,可以很方便的堆虚拟机进行监控或者故障排查等

    bin目录下的命令本质上都是Tools.jar的一层封装,首先对比一下常用的命令功能

    bin目录命令名称 功能描述
    jshell 类似于python控制台的,直接运行java代码,而不必编写class和main,java9之后出现
    java Java运行工具,用于运行.class字节码文件或.jar文件
    javac Java编译工具(Java Compiler),用于编译Java源代码文件。
    javadoc Java文档工具,主要用于根据Java源代码中的注释信息生成HTML格式的API帮助文档
    javap Java反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件。
    jcmd Java 命令行(Java Command),用于向正在运行的JVM发送诊断命令请求。
    jconsole 图形化用户界面的监测工具,主要用于监测并显示运行于Java平台上的应用程序的性能和资源占用等信息。
    jdb Java调试工具(Java Debugger),主要用于对Java应用进行断点调试。
    jhsdb 进程外的调试工具,主要从虚拟机中获取运行信息
    jimage 浏览JIMAGE文件的内容
    jlink 可以创建自己的自定义 JRE
    jmod 可以创建自己的自定义 JRE
    jpackage 可以创建自己的自定义 JRE
    jhat Java堆分析工具(Java Heap Analysis Tool),用于分析Java堆内存中的对象信息。
    jinfo Java配置信息工具(Java Configuration Information),用于打印指定Java进程、核心文件或远程调试服务器的配置信息。
    jmap Java内存映射工具(Java Memory Map),主要用于打印指定Java进程、核心文件或远程调试服务器的共享对象内存映射或堆内存细节
    jmc Java任务控制工具(Java Mission Control),主要用于HotSpot JVM的生产时间监测、分析、诊断。
    jps JVM进程状态工具(JVM Process Status Tool),用于显示目标系统上的HotSpot JVM的Java进程信息。
    jrunscript Java命令行脚本外壳工具(command line script shell),主要用于解释执行javascript、groovy、ruby等脚本语言。
    jstack Java堆栈跟踪工具,主要用于打印指定Java进程、核心文件或远程调试服务器的Java线程的堆栈跟踪信息。
    jstat JVM统计监测工具(JVM Statistics Monitoring Tool),主要用于监测并显示JVM的性能统计信息。
    jstatd jstatd(VM jstatd Daemon)工具是一个RMI服务器应用,用于监测HotSpot JVM的创建和终止,并提供一个接口,允许远程监测工具附加到运行于本地主机的JVM上。
    jvisualvm JVM监测、故障排除、分析工具,主要以图形化界面的方式提供运行于指定虚拟机的Java应用程序的详细信息。
    keytool 管理密钥库和证书
    kinit 用于获得和缓存网络认证协议Kerberos 票证的授予票证
    ktab 密钥和证书管理工具
    rmid Java远程方法调用(RMI:Remote Method Invocation)活化系统守护进程
    rmiregistry Java远程对象注册表
    serialver 返回类的 serialVersionUID序列化id

    jshell

    如果你想测试一段简单的代码,在java9中,就不必再打开编译器,再写个main方法运行了,可以直接使用jshell


    常用命令:

    /reset : 清空所有代码
    /list: 列出之前写的代码
    /history: 列出历史命令
    /methods: 列出已声明的方法
    /edit: 打开新面板编辑代码:

    /drop: 删除,可跟行数或者方法名进行删除
    保存与导入:

    java

    我们一般启用一个springBoot jar项目会直接使用java -jar,但是java工具还有很多其他的功能:
    java -jar Hello.jar 启动jar包
    还可以后面跟参数,添加或者覆盖原有参数:
    springboot方式: java -jar demo.jar --spring.profiles.active=dev --server.port=8181
    -D方式: java -jar demo.jar -Dspring.profiles.active=dev -Dserver.port=8181
    后台运行: nohup java -jar xxx.jar --server.port=81 &

    java -cp lib/;etc/ com.Start param1 param2 指定启动的jar包的主类,可以添加需要的配置文件和jar包,支持通配符
    将lib下的所有jar文件以及etc下的所有配置文件添加到 classpath 中
    注意:jar包匹配使用
    , 配置文件使用目录/,多个window上分号“;” linux上分号“:”

    javadoc

    javadoc 命令可以将java代码中的注释和说明信息,生成并输出到HTML文件中
    命令: javadoc -d -version -author -d 文档存放目录 源文件名.java 注意要配置编码,如果是中文
    -version -author 包含这两个注解的信息
    例如: 注释一个类:

    使用javadoc生成:

    也可以直接使用idea生成javadoc,注意要设置编码,其实也是执行的javadoc命令:


    注意设置编码直接用 -encoding UT-8, 空格就可以,不能用= ,javadoc生成包含了非常多的选项,可以在命令-help查看功能:

    javap

    javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。
    通过反编译生成的汇编代码,我们可以深入的了解java代码的工作机制,当然了还有更好用的反编译工具和idea,使用:
    java -选项 class文件
    一般使用的是-v -l -c三个选项:
    javap -v classxx,不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。
    javap -l 会输出行号和本地变量表信息。
    javap -c 会对当前class字节码进行反编译生成汇编代码。
    反汇编后的文件:

    jcmd

    在JDK 1.7之后,新增了一个命令行工具jcmd,可以替代jps,jinfo,jstat,jmap等命令的全能型工具,并且在jdk9和11中不断的加强了此工具,他有统一其他所有工具的趋势(图形工具除外)

    功能 jcmd 类似工具
    列出jcmd支持命令 jcmd pid help
    列出java进程 jcmd jps -l
    堆转储文件 jcmd pid GC.heap_dump name.bin jmap -dump
    堆对象统计信息 jcmd pid GC.class_histogram jmap -histo
    线程转储 jcmd pid Thread.print jstack
    列出系统属性 jcmd pid VM.system_properties jinfo -sysprops
    列出VM参数,-X 和 -XX jcmd pid VM.flags jinfo -flags
    虚拟机启动时间 jcmd pid VM.uptime
    列出所有性能相关数据 jcmd pid PerfCounter.print
    列出加载的类层次结构 jcmd pid VM.class_hierarchy
    列出启动命令(-D) jcmd pid VM.command_line
    列出java进程信息 jcmd pid VM.info
    执行垃圾回收 jcmd pid GC.run System.gc(),但不确定会马上执行
    列出被加载类的更详细信 jcmd pid GC.class_stats java9之前需要开启参数-XX:+UnlockDiagnosticVMOptions
    进行内存追踪 jcmd pid VM.native_memory java9之前需要开启参数-XX:NativeMemoryTracking=summary

    这里列举三个比较有意思的功能:

    1 jcmd pid GC.class_histogram

    堆对象直方图,可以很直观的看到每个类产生了多少个实例,以及这些实例共占用了多少内存:

    2 jcmd pid GC.class_stats

    GC.class_stats相比GC.class_histogram之外,能够提供被加载类的更详细信息,借助它,我们能够看到Metaspace每个类所占据的空间 ,看到每个类的实例所占用多少内存
    不过注意: GC.class_stats是一个高开销的诊断命令,它运行在全局SafePoint(STW暂停)中。对VM有很大影响
    除其他外,此操作遍历整个堆来计算所有加载类的所有实例占用的内存 ,已被移除在JDK 15。

    加载类的名称(ClassName)、每个类所占据的字节(KlassBytes)、每个类的实例所占据的字节(InstBytes)、每个类中方法的数量(MethodCount)、字节码所占据的空间(ByteCodes))等

    3 jcmd VM.native_memory

    java8给HotSpot VM引入了Native Memory Tracking (NMT)特性,可以用于追踪JVM的内部内存使用情况
    可以利用jcmd(jdk自带)这个工具来访问NMT的数据
    NMT必须先通过VM启动参数中打开,不过要注意的是,打开NMT会带来5%-10%的性能损耗。

    -XX:NativeMemoryTracking=[off | summary | detail]
    off: 默认关闭
    summary: 只统计各个分类的内存使用情况.
    detail: Collect memory usage by individual call sites.
    

    命令使用:

    jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]
    # summary: 分类内存使用情况.
    # detail: 详细内存使用情况,除了summary信息之外还包含了虚拟内存使用情况。
    # baseline: 创建内存使用快照,方便和后面做对比
    # summary.diff: 和上一次baseline的summary对比,需要先打个基线
    # detail.diff: 和上一次baseline的detail对比,需要先打个基线
    # shutdown: 关闭NMT
    

    演示:
    1 先打基线,如果不对比,也可以不打:

    2 然后查看内存使用信息:
    jcmd VM.native_memory summary scale=MB 可换算单位

    3 可以和基线时刻进行对比:

    4 输出NMT信息解释:

    jconsole

    jconsole是JDK内置的图形化Java性能分析工具,可以在命令行运行。启动可以更具Java进程id查看程序的堆使用,线程情况,类信息等。

    jhsdb

    jhsdbshi JDK 9用于处理性能和可维护性问题的新命令行工具: jhsdb,如果附加到进程,则会导致进程挂起,此命令jdk版本必须和项目保持一致
    jhsdb有几种模式,下面简单介绍一下:
    所有模式的部分参数:
    --pid 挂起进程的进程ID。
    --exe 可执行文件名。
    --core 核心转储文件名。
    --help 显示该命令可用的选项。

    jhsdb hsdb模式

    启动交互式GUI调试器。可以在GUI界面进行查找信息等操作

    还有其他两种debug模式,这里就不说了

    jhsdb jstack模式

    1 jhsdb jstack --locks --pid 6893 : 检测死锁信息以及打印锁的信息,
    我这里程序模拟了一个死锁,检测结果,后续会继续打印所有锁的信息:

    jhsdb jmap模式

    jhsdb的jmap模式提供的功能跟jmap和jcmd命令提供的功能一样。 这些包括堆转储( --heap ),类直方图( --histo ),类加载器统计( --clstats ),和释放信息( --finalizerinfo )
    例如: jhsdb jmap --histo --pid 844

    jhsdb jinfo模式

    打印基本的JVM信息。此模式和 jinfo以及jcmd命令功能也是一样的,这里不再赘述

    jhsdb jsnap模式

    jhsdb jsnap --pid 844
    打印性能计数器信息。包含启动的线程数,启动参数等等一些信息

    jimage

    java9提供了新的打包格式jimage,而不再使用jar这种文件格式打包
    jar是一个非常老的协议,它是基于很老的zip协议,效率上比较差,空间占用也比较大。
    jar是基于文件系统而不是基于module的,也就是说jar打包的原则是把某几个目录下的文件打成一个包
    java9模块化之后,就需要一种能通过模块直接加载class的方式,格式针对空间和速度进行了优化,这里简单介绍一下jimage:

    jimage工具可以解压jimage格式文件,以及打印jimage包的头部信息,以及模块列表等

    Jlink是Java的新命令行工具,用于将一系列模块聚合、优化,打包到一个自定义的jre镜像中,
    默认JRE的大小为203 MB。为了执行简单的很少的代码,必须在计算机中维护203 MB的JRE。这完全是浪费内存
    有了jlink,就可以创建我们需要的jre,只包含我们需要的类,从而减少内存,提高性能,这就更适合开发物联网和微服务

    jmod

    jpackage

    jdb

    jhat

    用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果,一般与jmap搭配使用,
    不过功能比较简陋,一般使用其他工具来分析dump文件,比如:Eclipse MAT,Yourkit等

    "Server is ready."出现后就可以在浏览器中键入http://localhost:7000 查看分析结果了, 此功能在jdk11之后已被移除

    jinfo

    主要用于打印配置信息,包括命令行参数、系统变量。极少数的情况下,我们可以用其来修改命令行参数
    没有选项直接打印虚拟机参数和系统参数
    jinfo -flags 进程号: 打印虚拟机参数
    jinfo -sysprops 进程号: 打印系统变量
    jinfo -flag +- 进程号:开启或者关闭虚拟机参数

    jmap

    jmap可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列
    -dump: 生成堆转储快照

    -histo 显示堆中对象的统计信息:
    冷知识:一个最简单的springboot项目初始化会创建26万多个对象(String就有四万多个),总共2780个类
    添加live只统计活着的对象

    -clstats: 打印类加载器信息

    -finalizerinfo 打印等待回收的对象信息

    -heap :打印heap堆的概要信息,GC使用的算法,heap的配置及wise heap的使用情况 |

    jmc

    jps

    列出正在运行的JVM虚拟机进程并显示主类和进程id等信息

    jrunscript

    jsadebugd

    jstack

    java堆栈跟踪工具,用于生成当前时刻虚拟机内每一条线程正在执行的方法堆栈集合,以定位线程出现长时间停顿原因
    jstack -l pid:

    jstat

    jstat可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集情况、JIT编译等运行数据
    格式: jstat 选项 进程ID 间隔时间(毫秒) 查询次数:


    其他参数:

    jstatd

    jvisualvm

    此命令JDK9之后就被移除了,不过可以在官网下载
    需要在项目启动的时候添加对应参数:

    # 远程服务器ip,对应的端口,是否使用SSL和权限验证等
    -Djava.rmi.server.hostname=192.168.120.30 -Dcom.sun.management.jmxremote.port=9528 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
    

    新建JMX连接,

    监控效果如图,还可以查jvm参数信息,线程情况等:

    keytool

    kinit

    ktab

    rmid

    rmiregistry

    serialver

    GC日志

    打印日志详细信息

  • 相关阅读:
    JVM学习02:GC垃圾回收和内存分配
    JVM学习01:内存结构
    webservice学习01:wsdl文档结构
    项目总结21:项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库)
    mysql学习3:mysql之my.cnf详解
    项目总结20:阿里云免费https证书申请
    5月9日——vue渲染过程中{{xxx}}显示
    5月8日——iOS中的3D Touch效果
    5月7日——采用第三方页面内容,但是顶部title使用自己的
    5月5日——更改手机状态栏的背景颜色
  • 原文地址:https://www.cnblogs.com/houzheng/p/15025990.html
Copyright © 2011-2022 走看看