JDK的bin下的工具有哪些功能

Java生产环境下问题排查

JVM源码分析之Jstat工具原理完全解读

Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息

Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析

Java内存泄漏分析系列之三:jstat命令的使用及VM Thread分析

Java内存泄漏分析系列之四:jstack生成的Thread Dump日志线程状态

Java内存泄漏分析系列之五:常见的Thread Dump日志案例分析

Java内存泄漏分析系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用

查看JVM参数

jps -l 查看所有正在运行的Java程序,同时显示启动类类名,获取到PID

1
2
4706 org.apache.catalina.startup.Bootstrap
5023 sun.tools.jps.Jps

jinfo -flags PID 查看运行时进程参数与JVM参数

1
2
3
4
5
6
Attaching to process ID 28987, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=132120576 -XX:MaxHeapSize=2092957696 -XX:MaxNewSize=697303040 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44040192 -XX:OldSize=88080384 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Command line: -Dspring.config.location=application.properties -Dspring.profiles.active=staging

java -XX:+PrintFlagsFinal -version 查看当前虚拟机默认JVM参数

查看即时GC状态

jstat -gc PID 1000 10 每秒查看一次gc信息,共10次

输出比较多的参数,每个字段的解释参看 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

1
2
S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
512.0 512.0 15.3 0.0 4416.0 1055.2 11372.0 7572.5 14720.0 14322.5 1664.0 1522.8 40 0.137 8 0.039 0.176

期间可能碰到提示sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 24.181-b01. Target VM is 25.171-b11的问题,原因在于安装了多个版本,使用whichls -l可简介定位到与当前执行Java程序相同的Java版本

内存问题

内存泄露导致OOM?内存占用异常的高?这是生产环境常常出现的问题,Java提供dump文件供我们对内存里发生过的事情进行了记录,我们需要借助一些工具从中获取有价值的信息。

导出Dump文件

  1. 提前对Java程序加上这些参数印dump文件 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
  2. 对正在运行的程序使用jmapjmap -dump:format=b,file=heap.hprof PID

分析Dump文件

如果Dump文件不太大的话,可以传到 http://heaphero.io/index.jsp 来分析

文件比较大,且想进行更加系统的分析,推荐使用MAT分析,有如下几种常用查看方式

  1. 首页中的【Leak Suspects】能推测出问题所在
  2. 点击【Create a histogram from an arbitrary set of objects】查到所有对象的数量
  3. 右键点击某个对象【Merge Shortest Paths to GC Roots】-> 【exclude all phantom/weak/soft etc. references】能查询到大量数量的某个对象是哪个GC ROOT引用的

线程问题

任务长时间不退出?CPU 负载过高?很可能因为死循环或者死锁,导致某些线程一直执行不被中断,但是不报错是最烦人的,所以日志里看不到错误信息,并且又不能用dump文件分析,因为跟内存无关。这个时候就需要用线程分析工具来帮我们了。

导出jstack文件

使用jstack PID > 文件,如果失败请加-F参数,如果还失败请使用Java程序启动时使用的用户执行jstack

排查步骤

  1. top 查看到哪个java程序负载高
  2. top -p PID -H 查看该进程所有进程的运行状态
  3. 记录下高负载的线程ID,printf "&x" PID转换成16进制
  4. jstack PID > 文件
  5. 在jstack文件中用转换成16进制之后的线程ID查询线程运行堆栈
  6. 从堆栈中了解到线程在执行什么任务,并结合业务与代码判断问题所在

以下转载自: http://www.codingwhy.com/view/858.html

Java开发人员肯定都知道JDK的bin目录中有“java”、“javac”这两个命令行工具,但并非所有的程序员都了解过JDK的bin目录之中的其他工具的作用。

这些工具被Sun公司作为“礼物”附赠给JDK的使用者,并在软件的使用说明中把他们申明为“没有技术支持并且是试验性质的(unsupported and experimental)”的产品,但事实上,这些工具都非常的稳定且功能强大,能在处理应用程序性能问题、定位故障时发挥很大的作用。

细心的可能会发现,这些工具都非常小,是因为这些工具大多是jdk/lib/tools.jar类库的一层包装而已,他们主要的功能代码是在tools类库中实现的。

Java故障检修,程序概要分析,监视和管理工具

工具名称 用途
jvisualvm 一个图形化的Java虚拟机 参考: Java jvisualvm简要说明
jconsole java监视台和管理控制台 参考: 如何利用 JConsole观察分析Java程序的运行,进行排错调优 https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.vm.80.doc/docs/jconsole.html
jps JVM Process Status进程状态工具。列出目标系统的HotSpot JJVM 可以列出本机所有java进程的pid
jstat 按照命令行的具体要求记录和收集一个JVM的性能数据
jstatd JVM jstat 的守护进程
jmc Java任务控制工具(Java Mission Control),主要用于HotSpot JVM的生产时间监测、分析、诊断。

故障检测和修理工具

工具名称 用途
jinfo 配置或打印某个Java进程VM flag
jhat 堆储存查看器
jmap Java内存图
jsadebugd Java的 Serviceability Agent Debug的守护进程
jstack Java堆栈跟踪

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

基本工具

这些工具是JDK的基础,用这些工具来编写应用程序。

工具名称 用途
javac Java语言编译器
java Java应用程序启动器
javaw Java运行工具,用于运行.class字节码文件或.jar文件,但不会显示控制台输出信息,适用于运行图形化程序。
javadoc Java API文档生成器
apt java 注解处理器 「深入Java」Annotation注解
appletviewer java applet小程序查看器
jar java文件压缩打包工具
jdb Java调试器
javah C头文件和stub生成器,用于写本地化方法,例如生产JNI样式的头文件
javap class文件反编译工具
extcheck 用于检测jar包中的问题
jcmd Java命令行(Java Command),用于向正在运行的JVM发送诊断命令请求。

安全工具

这些工具用于设置系统的安全规则和生产可以工作在远端的安全规则下的应用程序

工具名称 用途
keytool 管理密钥库和证书
jarsigner 生产和校验JAR签名
policytool 有用户界面的规则管理工具
kinit 用于获得和缓存网络认证协议Kerberos 票证的授予票证
klist 凭据高速缓存和密钥表中的 Kerberos 显示条目
ktab 密钥和证书管理工具

Java国际化工具

这些工具可以帮助你创建可本地化的应用程序

native2ascii

远程方法调用工具

这些工具可以帮助创建可以和web和网络交互的应用程序

工具名称 用途
rmic 生成远程对象的stubs and skeletons(存根和框架)
rmid Java远程方法调用(RMI:Remote Method Invocation)活化系统守护进程
rmiregistry Java远程对象注册表
serialver 返回类的 serialVersionUID
java-rmi Java远程方法调用(Java Remote Method Invocation)工具,主要用于在客户机上调用远程服务器上的对象

Java IDL and RMI-IIOP 工具

这些工具用于创建使用OMG-Standard IDL 和 CORBA/IIOP 的应用程序

工具名称 用途
tnameserv Java IDL瞬时命名服
idlj 生产映射到OMG IDL接口可以使Java应用程序使用CORBA的.java文件
orbd 为客户可以在CORBA环境下透明的定位和调用服务器的稳定的对象提供支持
servertool 为应用程序提供易于使用的接口用于注册,注销,启动,关闭服务器

Java部署工具

工具名称 用途
pack200 使用java gzip压缩工具将JAR文件转换为压缩的pack200文件,生产打包文件是高度压缩的JAR包,可以直接部署,减少下载时间
unpack200 解包pack200文件为JARs

Java web工具

工具名称 用途
javaws Java web 启动命令行工具
schemagen Java构架的XML Schema生成器
wsgen 生成 JAX-WS
wsimport 生成 JAX-WS
xjc 绑定编译器

Java脚本工具

工具名称 用途
jrunscript 运行脚本

其他工具

工具名称 用途
jabswitch Java Access Bridge Switch的简称,用于控制Java访问桥的开/关。Java访问桥是一种技术,让Java应用程序实现Accessibility API,以供Microsoft Windows系统的辅助技术访问。
javafxpackager JavaFX打包工具