性能调优-JDK Bin目录工具介绍及使用

image.png

简介

在JDK包中bin目录下提供许多可执行的文件,接下来我们将逐一进行介绍各个工具的主要用途及其使用方法,主要包含的内容如下所示:

基本工具

appletviewer

早期运行在浏览器上的applet程序(已过时不在讨论)
https://docs.oracle.com/javase/7/docs/technotes/tools/windows/appletviewer.html

extcheck

extcheck命令检查指定的JAR文件的标题和版本是否与javasesdk中安装的任何扩展冲突。在安装扩展之前,可以使用此实用程序查看是否已安装相同或更新版本的扩展。

jar

主要用于将文件打包成.jar的工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项:
-c 创建新档案
-t 列出档案目录
-x 从档案中提取指定的 (或所有) 文件(解压jar)
-u 更新现有档案
-v 在标准输出中生成详细输出
-f 指定档案文件名
-m 包含指定清单文件中的清单信息
-n 创建新档案后执行 Pack200 规范化
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储; 不使用任何 ZIP 压缩
-P 保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含以下文件
如果任何文件为目录, 则对其进行递归处理。
清单文件名, 档案文件名和入口点名称的指定顺序
'm', 'f''e' 标记的指定顺序相同。

示例 1: 将两个类文件归档到一个名为 classes.jar 的档案中:
jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 'mymanifest'
将 foo/ 目录中的所有文件归档到 'classes.jar' 中:
jar cvfm classes.jar mymanifest -C foo/ .

java

主要用于运行Java文件的工具,在运行的同时可以加上相关参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
其中选项包括:
-d32 使用 32 位数据模型 (如果可用)
-d64 使用 64 位数据模型 (如果可用)
-server 选择 "server" VM
默认 VM 是 server,
因为您是在服务器类计算机上运行。


-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
用 : 分隔的目录, JAR 档案
和 ZIP 档案列表, 用于搜索类文件。
-D<名称>=<值>
设置系统属性
-verbose:[class|gc|jni]
启用详细输出
-version 输出产品版本并退出
-version:<值>
警告: 此功能已过时, 将在
未来发行版中删除。
需要指定的版本才能运行
-showversion 输出产品版本并继续
-jre-restrict-search | -no-jre-restrict-search
警告: 此功能已过时, 将在
未来发行版中删除。
在版本搜索中包括/排除用户专用 JRE
-? -help 输出此帮助消息
-X 输出非标准选项的帮助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度启用断言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的断言
-esa | -enablesystemassertions
启用系统断言
-dsa | -disablesystemassertions
禁用系统断言
-agentlib:<libname>[=<选项>]
加载本机代理库 <libname>, 例如 -agentlib:hprof
另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]
按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]
加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>
使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

javac

java程序编译器主要用于将java文件编译成字节码文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
用法: javac <options> <source files>
其中, 可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖所安装扩展的位置
-endorseddirs <目录> 覆盖签名的标准路径的位置
-proc:{none,only} 控制是否执行注释处理和/或编译。
-processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
-processorpath <路径> 指定查找注释处理程序的位置
-parameters 生成元数据以用于方法参数的反射
-d <目录> 指定放置生成的类文件的位置
-s <目录> 指定放置生成的源文件的位置
-h <目录> 指定放置生成的本机标头文件的位置
-implicit:{none,class} 指定是否为隐式引用文件生成类文件
-encoding <编码> 指定源文件使用的字符编码
-source <发行版> 提供与指定发行版的源兼容性
-target <发行版> 生成特定 VM 版本的类文件
-profile <配置文件> 请确保使用的 API 在指定的配置文件中可用
-version 版本信息
-help 输出标准选项的提要
-A关键字[=值] 传递给注释处理程序的选项
-X 输出非标准选项的提要
-J<标记> 直接将 <标记> 传递给运行时系统
-Werror 出现警告时终止编译
@<文件名> 从文件读取选项和文件名

javadoc

主要用与Java文档生成的相关操作,在类或者方法上打好注解即可通过这个工具生成文档。

javah

javah命令生成实现本机方法所需的C头文件和源文件。C程序使用生成的头文件和源文件从本机源代码引用对象的实例变量。.h文件包含一个结构定义,其布局与相应类的布局平行。结构中的字段对应于类中的实例变量。

头文件的名称和其中声明的结构是从类的名称派生的。当传递给javah命令的类位于包内时,包名将添加到头文件名和结构名的开头。下划线(\)用作名称分隔符。

默认情况下,javah命令为命令行中列出的每个类创建一个头文件,并将这些文件放在当前目录中。使用-stubs选项创建源文件。使用-o选项将所有列出的类的结果连接到一个文件中。

Java本机接口(JNI)不需要头信息或存根文件。javah命令仍然可以用于生成JNI风格本机方法所需的本机方法函数原型。javah命令默认生成JNI样式的输出,并将结果放入.h文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
用法: 
javah [options] <classes>
其中, [options] 包括:
-o <file> 输出文件 (只能使用 -d 或 -o 之一)
-d <dir> 输出目录
-v -verbose 启用详细输出
-h --help -? 输出此消息
-version 输出版本信息
-jni 生成 JNI 样式的标头文件 (默认值)
-force 始终写入输出文件
-classpath <path> 从中加载类的路径
-cp <path> 从中加载类的路径
-bootclasspath <path> 从中加载引导类的路径
<classes> 是使用其全限定名称指定的
(例如, java.lang.Object)。

javap

字节码反汇编工具,可以将一个或多个.class文件进行反编译。javap命令反汇编一个或多个类文件。输出取决于使用的选项。如果没有使用任何选项,javap命令将打印包、受保护字段和公共字段,以及传递给它的类的方法。javap命令将其输出打印到stdout。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
用法: javap <options> <classes>
其中, 可能的选项包括:
-help --help -? 输出此用法消息
-version 版本信息
-v -verbose 输出附加信息
-l 输出行号和本地变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类
和成员 (默认)
-p -private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的
系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置

jdb

javadebugger(JDB)是一个简单的Java类命令行调试器。jdb命令及其选项称为jdb。jdb命令演示Java平台调试器体系结构(JDBA),并提供本地或远程Java虚拟机(JVM)的检查和调试。请参阅http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/index.html

启动JDB会话
有许多方法可以启动JDB会话。最常用的方法是让JDB使用要调试的应用程序的主类启动一个新的JVM。为此,在命令行中用jdb命令代替java命令。例如,如果应用程序的主类是MyClass,则使用以下命令在JDB下对其进行调试:

1
jdb MyClass类

当以这种方式启动时,jdb命令使用指定的参数调用第二个JVM,加载指定的类,并在执行该类的第一条指令之前停止JVM。
使用jdb命令的另一种方法是将它附加到已经运行的JVM上。当JVM运行时,启动jdb命令附加到的JVM的语法如下所示。这将加载进程内调试库并指定要建立的连接的类型。

1
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 MyClass.java

然后可以使用以下命令将jdb命令附加到JVM:

1
jdb -attach 8000

在本例中,没有在jdb命令行中指定MyClass参数,因为jdb命令正在连接到现有的JVM,而不是启动新的JVM。
将调试器连接到JVM还有许多其他方法,所有这些方法都受jdb命令支持。Java平台调试器体系结构有关于这些连接选项的附加文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
** 命令列表 **
connectors -- 列出此 VM 中可用的连接器和传输

run [class [args]] -- 开始执行应用程序的主类

threads [threadgroup] -- 列出线程
thread <thread id> -- 设置默认线程
suspend [thread id(s)] -- 挂起线程 (默认值: all)
resume [thread id(s)] -- 恢复线程 (默认值: all)
where [<thread id> | all] -- 转储线程的堆栈
wherei [<thread id> | all]-- 转储线程的堆栈, 以及 pc 信息
up [n frames] -- 上移线程的堆栈
down [n frames] -- 下移线程的堆栈
kill <thread id> <expr> -- 终止具有给定的异常错误对象的线程
interrupt <thread id> -- 中断线程

print <expr> -- 输出表达式的值
dump <expr> -- 输出所有对象信息
eval <expr> -- 对表达式求值 (与 print 相同)
set <lvalue> = <expr> -- 向字段/变量/数组元素分配新值
locals -- 输出当前堆栈帧中的所有本地变量

classes -- 列出当前已知的类
class <class id> -- 显示已命名类的详细资料
methods <class id> -- 列出类的方法
fields <class id> -- 列出类的字段

threadgroups -- 列出线程组
threadgroup <name> -- 设置当前线程组

stop in <class id>.<method>[(argument_type,...)]
-- 在方法中设置断点
stop at <class id>:<line> -- 在行中设置断点
clear <class id>.<method>[(argument_type,...)]
-- 清除方法中的断点
clear <class id>:<line> -- 清除行中的断点
clear -- 列出断点
catch [uncaught|caught|all] <class id>|<class pattern>
-- 出现指定的异常错误时中断
ignore [uncaught|caught|all] <class id>|<class pattern>
-- 对于指定的异常错误, 取消 'catch'
watch [access|all] <class id>.<field name>
-- 监视对字段的访问/修改
unwatch [access|all] <class id>.<field name>
-- 停止监视对字段的访问/修改
trace [go] methods [thread]
-- 跟踪方法进入和退出。
-- 除非指定 'go', 否则挂起所有线程
trace [go] method exit | exits [thread]
-- 跟踪当前方法的退出, 或者所有方法的退出
-- 除非指定 'go', 否则挂起所有线程
untrace [methods] -- 停止跟踪方法进入和/或退出
step -- 执行当前行
step up -- 一直执行, 直到当前方法返回到其调用方
stepi -- 执行当前指令
下一步 -- 步进一行 (步过调用)
cont -- 从断点处继续执行

list [line number|method] -- 输出源代码
use (或 sourcepath) [source file path]
-- 显示或更改源路径
exclude [<class pattern>, ... | "none"]
-- 对于指定的类, 不报告步骤或方法事件
classpath -- 从目标 VM 输出类路径信息

monitor <command> -- 每次程序停止时执行命令
monitor -- 列出监视器
unmonitor <monitor#> -- 删除监视器
read <filename> -- 读取并执行命令文件

lock <expr> -- 输出对象的锁信息
threadlocks [thread id] -- 输出线程的锁信息

pop -- 通过当前帧出栈, 且包含当前帧
reenter -- 与 pop 相同, 但重新进入当前帧
redefine <class id> <class file name>
-- 重新定义类的代码

jdeps

jdeps命令显示Java类文件的包级或类级依赖关系。输入类可以是.class文件、目录、JAR文件的路径名,也可以是分析所有类文件的完全限定类名。选项决定输出。默认情况下,jdeps将依赖项输出到系统输出。它可以用DOT语言生成依赖项(请参见-dotpoutput选项)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
用法: jdeps <options> <classes...>
其中 <classes> 可以是 .class 文件, 目录, JAR 文件的路径名,
也可以是全限定类名。可能的选项包括:
-dotoutput <dir> DOT 文件输出的目标目录
-s -summary 仅输出被依赖对象概要
-v -verbose 输出所有类级别被依赖对象
等同于 -verbose:class -filter:none。
-verbose:package 默认情况下输出程序包级别被依赖对象,
不包括同一程序包中的被依赖对象
-verbose:class 默认情况下输出类级别被依赖对象,
不包括同一程序包中的被依赖对象
-cp <path> -classpath <path> 指定查找类文件的位置
-p <pkgname> -package <pkgname> 查找与给定程序包名称匹配的被依赖对象
(可多次指定)
-e <regex> -regex <regex> 查找与指定模式匹配的被依赖对象
(-p 和 -e 互相排斥)
-f <regex> -filter <regex> 筛选与指定模式匹配的被依赖对象
如果多次指定, 则将使用最后一个被依赖对象。
-filter:package 筛选位于同一程序包内的被依赖对象 (默认)
-filter:archive 筛选位于同一档案内的被依赖对象
-filter:none 不使用 -filter:package 和 -filter:archive 筛选
通过 -filter 选项指定的筛选仍旧适用。
-include <regex> 将分析限制为与模式匹配的类
此选项筛选要分析的类的列表。
它可以与向被依赖对象应用模式的
-p 和 -e 结合使用
-P -profile 显示配置文件或包含程序包的文件
-apionly 通过公共类 (包括字段类型, 方法参数
类型, 返回类型, 受控异常错误类型
等) 的公共和受保护成员的签名
限制对 API (即被依赖对象)
进行分析
-R -recursive 递归遍历所有被依赖对象。
-R 选项表示 -filter:none。如果指定了 -p, -e, -f
选项, 则只分析匹配的
被依赖对象。
-jdkinternals 在 JDK 内部 API 上查找类级别的被依赖对象。
默认情况下, 它分析 -classpath 上的所有类
和输入文件, 除非指定了 -include 选项。
此选项不能与 -p, -e 和 -s 选项一起使用。
警告: 在下一个发行版中可能无法访问
JDK 内部 API。
-version 版本信息

安全工具

keytool

keytool命令是一个密钥和证书管理实用程序。它使用户能够管理自己的公钥/私钥对和相关证书,以便使用数字签名在自我身份验证(其中用户向其他用户和服务验证自己)或数据完整性和身份验证服务中使用。keytool命令还允许用户缓存其通信对等方的公钥(以证书的形式)。证书是一个实体(个人、公司等)的数字签名语句,表示其他实体的公钥(和其他一些信息)具有特定的值(当对数据进行数字签名时,可以验证签名以检查数据的完整性和真实性。完整性意味着数据没有被修改或篡改,真实性意味着数据来自于声称创建和签名的人。
keytool命令还允许用户管理对称加密和解密(DES)中使用的密钥和密码短语。
keytool命令将密钥和证书存储在密钥库中。请参见密钥库别名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
密钥和证书管理工具

命令:

-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令

使用 "keytool -command_name -help" 获取 command_name 的用法

jarsigner

jarsigner工具有两个用途:

  • 签署Java存档(JAR)文件。
  • 验证签名JAR文件的签名和完整性。

JAR特性支持将类文件、图像、声音和其他数字数据打包到一个文件中,以便更快更容易地分发。名为jar的工具使开发人员能够生成jar文件(从技术上讲,任何zip文件也可以被视为JAR文件,尽管在由JAR命令创建或由

jarsigner命令处理时,JAR文件还包含META-INF/MANIFEST.MF文件。)
数字签名是由一些数据(被签名的数据)和实体(个人、公司等)的私钥计算出的一串位。与手写签名类似,数字签名具有许多有用的特征:
它的真实性可以通过使用与用于生成签名的私钥相对应的公钥的计算来验证。
如果私钥是保密的,就不能伪造。
它是已签名数据的函数,因此不能声称是其他数据的签名。
无法更改已签名的数据。如果更改了数据,则无法验证签名的真实性。
要为文件生成实体的签名,该实体必须首先具有与其关联的公钥/私钥对以及一个或多个对其公钥进行身份验证的证书。证书是一个实体的数字签名语句,表示另一个实体的公钥具有特定值。
jarsigner命令使用密钥库中的密钥和证书信息为JAR文件生成数字签名。密钥库是私钥及其相关的X.509证书链的数据库,用于验证相应的公钥。keytool命令用于创建和管理密钥库。
jarsigner命令使用实体的私钥来生成签名。签名的JAR文件包含来自密钥库的证书副本,该密钥对应于用于对文件签名的私钥。jarsigner命令可以使用已签名JAR文件中的证书(在其签名块文件中)来验证已签名JAR文件的数字签名。
jarsigner命令可以生成包含时间戳的签名,该时间戳允许系统或部署人员(包括Java插件)在签名证书仍然有效时检查JAR文件是否已签名。此外,api允许应用程序获取时间戳信息。
此时,jarsigner命令只能对JAR命令创建的JAR文件或zip文件进行签名。JAR文件与zip文件相同,只是它们还有一个META-INF/MANIFEST.MF文件。jarsigner命令对zip文件进行签名时,会创建一个META-INF/MANIFEST.MF文件。
默认的jarsigner命令行为是对JAR或zip文件进行签名。使用-verify选项验证已签名的JAR文件。
jarsigner命令还尝试在签名或验证之后验证签名者的证书。如果存在验证错误或任何其他问题,该命令将生成警告消息。如果指定-strict选项,则该命令将严重警告视为错误。请参阅错误和警告。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
用法: jarsigner [选项] jar-file 别名
jarsigner -verify [选项] jar-file [别名...]

[-keystore <url>] 密钥库位置

[-storepass <口令>] 用于密钥库完整性的口令

[-storetype <类型>] 密钥库类型

[-keypass <口令>] 私有密钥的口令 (如果不同)

[-certchain <文件>] 替代证书链文件的名称

[-sigfile <文件>] .SF/.DSA 文件的名称

[-signedjar <文件>] 已签名的 JAR 文件的名称

[-digestalg <算法>] 摘要算法的名称

[-sigalg <算法>] 签名算法的名称

[-verify] 验证已签名的 JAR 文件

[-verbose[:suboptions]] 签名/验证时输出详细信息。
子选项可以是 all, grouped 或 summary

[-certs] 输出详细信息和验证时显示证书

[-tsa <url>] 时间戳颁发机构的位置

[-tsacert <别名>] 时间戳颁发机构的公共密钥证书

[-tsapolicyid <oid>] 时间戳颁发机构的 TSAPolicyID

[-tsadigestalg <算法>] 时间戳请求中的摘要数据的算法

[-altsigner <类>] 替代的签名机制的类名

[-altsignerpath <路径列表>] 替代的签名机制的位置

[-internalsf] 在签名块内包含 .SF 文件

[-sectionsonly] 不计算整个清单的散列

[-protected] 密钥库具有受保护验证路径

[-providerName <名称>] 提供方名称

[-providerClass <类> 加密服务提供方的名称
[-providerArg <参数>]]... 主类文件和构造器参数

[-strict] 将警告视为错误

policytool

policytool命令调用管理员的GUI,使系统管理员能够管理本地策略文件的内容。策略文件是扩展名为.policy的纯文本文件,它按域将远程请求者映射到权限对象。有关详细信息,请参阅http://docs.oracle.com/javase/8/docs/technotes/guides/security/PolicyFiles.html

kinit

用于获取Kerberos v5票证的kinit工具。通过kinit工具在Solaris操作系统上提供了等效的功能。例如,对于Solaris 11

klist

klist命令行工具,用于列出凭证缓存和密钥选项卡中的条目。在Solaris操作系统上,通过klist工具可以获得等效的功能。例如,对于Solaris 11

ktab

ktab命令行工具,帮助用户管理键表中的条目。在Solaris操作系统上,通过kadmin工具可以获得等效的功能。例如,对于solaris11。

国际化工具

native2ascii

native2ascii命令将Java运行时环境(JRE)支持的编码文件转换为ASCII编码的文件,对不属于ASCII字符集的所有字符使用Unicode转义(\uxxx)表示法。对于包含不在ISO-8859-1字符集中的字符的属性文件,需要此过程。该工具还可以执行反向转换。如果outputfile值被省略,那么输出将使用标准输出。此外,如果省略了inputfile值,则使用标准输入进行输入。

1
native2ascii [ inputfile ] [ outputfile ]

远程方法调用工具

rmic

为使用Java远程方法协议(JRMP)或Internet Orb间协议(IIOP)的远程对象生成存根、骨架和绑定类。还生成对象管理组(OMG)接口定义语言(IDL)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
用法: rmic <options> <class names>

其中 <options> 包括:
-keep 不删除临时生成的源文件
-keepgenerated (与 "-keep" 相同)
-v1.1 创建 1.1 存根协议版本的存根/骨架 (已过时)
-vcompat 创建与 1.11.2 存根协议版本
都兼容的存根/骨架 (已过时)
-v1.2 (默认值) 仅创建 1.2 存根协议版本的存根 (已过时)
-iiop 创建 IIOP 的存根。如果提供, <options> 还包括:

-always 创建存根 (即使当前显示)
-alwaysgenerate (与 "-always" 相同)
-nolocalstubs 不创建对相同进程优化的存根

-idl 创建 IDL。如果提供, <options> 还包括:

-noValueMethods 不为值类型生成方法
-always 创建 IDL (即使当前显示)
-alwaysgenerate (与 "-always" 相同)

-g 生成调试信息
-nowarn 不生成任何警告
-nowrite 不将编译的类写入文件系统
-verbose 输出有关编译器正在执行的操作的消息
-classpath <path> 指定查找输入类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置
-extdirs <path> 覆盖所安装扩展的位置
-d <directory> 指定放置生成的类文件的位置
-J<runtime flag> 将参数传递给 java 解释器

rmiregistry

在当前主机的指定端口上启动远程对象注册表。

1
rmiregistry [ port ]

rmid

启动激活系统守护进程,使对象能够在Java虚拟机(JVM)中注册和激活。rmid命令启动激活系统守护进程。必须先启动激活系统守护进程,然后才能向激活系统注册可激活对象或在JVM中激活可激活对象。有关如何编写使用可激活对象的程序的详细信息,请参阅http://docs.oracle.com/javase/8/docs/technotes/guides/rmi/activation/overview.html
通过执行rmid命令并指定安全策略文件来启动守护程序,如下所示:

1
rmid -J-Djava.security.policy=rmid.policy

语法

1
rmid [options]

serialver

serialver命令返回一个或多个类的serialVersionUID,其形式适合复制到正在演化的类中。在没有参数的情况下调用时,serialver命令会打印一个用法行。

1
用法: serialver [-classpath 类路径] [-show] [类名称...]

Java IDL和RMI-IIOP工具

Java IDL:JavaIDL是Java 2开发平台中的CORBA功能扩展。在Java 2中引入JavaIDL,使得利用OMG IDL能够定义服务对象的基本功能,并且将IDL根据CORBA规范的要求,映射到Java语言,并以此开发出标准的具有互操作性和可连接性的分布式应用。

RMI-IIOP:RMI以Java为核心,可与采用本机方法与现有系统相连接。IIOP,Internet Inter-ORB Protocol(互联网内部对象请求代理协议),它是一个用于CORBA 2.0及兼容平台上的协议。

tnameserv

javaidl包括对象请求代理守护进程(objectrequestbrokerdaemon,ORBD)。ORBD是一个守护进程,它包含引导服务、临时命名服务、持久命名服务和服务器管理器。javaidl教程都使用ORBD,但是在任何使用临时命名服务的示例中,您都可以用tnameserv命令代替ORBD命令。

1
tnameserve -ORBInitialPort [ nameserverport ]

idlj

为指定的接口定义语言(IDL)文件生成Java绑定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
编译器用法:

java com.sun.tools.corba.se.idl.toJavaPortable.Compile [选项] <idl 文件>

其中, <idl 文件> 是包含 IDL 定义的文件的名称, 而
[选项] 是下列选项的任意组合。选项
是可选的, 并且显示顺序并不固定; <idl 文件> 是必需的,
并且必须显示在最后。

选项:
-d <符号> 这等同于 IDL 文件中的
下面一行: #define <符号>
-emitAll 发出所有类型, 包括在 #included 文件中找到的类型。
-f<side> 定义要发出哪些绑定。<side> 是 client,
server, all, serverTIE, allTIE 之一。serverTIE 和 allTIE
导致发出委派模型骨架。如果未使用
此标记, 将假定为 -fclient。
-i <包含路径> 默认情况下, 将在当前目录中扫描
包含的文件。此选项将添加另一个目录。
-keep 如果要生成的文件已存在, 请不要
覆盖它。默认情况下会覆盖它。
-noWarn 隐藏警告。
-oldImplBase 生成与旧版 (1.4 版之前) JDK ORB 兼容的骨架。
-pkgPrefix <t> <前缀> 当在文件范围内遇到类型或模块名 <t> 时,
在为 <t> 生成的所有文件的 Java 程序包名前
添加 <前缀>。
-pkgTranslate <t> <pkg> 当遇到类型或模块名 <t> 时, 在
生成的 Java 程序包中将其替换为 <pkg>。请注意,
将首先进行 pkgPrefix 更改。<t> 必须与
完整程序包名完全匹配。另外, <t> 不能为
org, org.omg 或 org.omg 的任何子程序包。
-skeletonName <xxx%yyy> 根据模式命名骨架。
默认值为:
%POA 表示 POA 基类 (-fserver 或 -fall)
_%ImplBase 表示 oldImplBase 基类
(-oldImplBase 和 (-fserver 或 -fall))。
-td <dir> 使用 <dir> 表示输出目录以代替
当前目录。
-tieName <xxx%yyy> 根据模式命名 tie。默认值为:
%POATie 表示 POA tie (-fserverTie 或 -fallTie)
%_Tie 表示 oldImplBase tie
(-oldImplBase 和 (-fserverTie 或 -fallTie))。
-v, -verbose 详细模式。
-version 显示版本号并退出。

orbd

使客户机能够在CORBA环境中定位和调用服务器上的持久对象。

1
orbd [ options ]

servertool

为开发人员注册、注销、启动和关闭持久服务器提供了一个易于使用的界面。
语法:

1
servertool -ORBInitialPort nameserverport [ options ] [ commands ]

可用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
可用命令: 
-------------------

register - 注册一个可激活的服务器
unregister - 注销已注册的服务器
getserverid - 返回 applicationName 的服务器 ID
list - 列出所有已注册服务器
listappnames - 列出当前定义的 applicationName
listactive - 列出当前活动的服务器
locate - 为已注册服务器定位特定类型的端口
locateperorb - 为已注册服务器的特定对象请求代理程序定位端口。
orblist - 对象请求代理程序 (orb) 名称及其映射列表
shutdown - 关闭一个已注册服务器
startup - 启动一个已注册服务器
help - 获取帮助
quit - 退出此工具

Java开发工具

javapackager

主要用于管理java包的工具,创建jar包,部署,签名等

pack200

使用javagzip压缩器将JAR文件转换为压缩的pack200文件。压缩打包文件是高度压缩的jar,可以直接部署,节省带宽,减少下载时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
用法:  pack200 [-opt... | --option=value]... x.pack[.gz] y.jar

打包选项
-g, --no-gzip 输出无格式的 *.pack 文件, 不压缩
--gzip (默认值) 使用 gzip 对打包进行后处理
-G, --strip-debug 打包时删除调试属性
-O, --no-keep-file-order 不传输文件排序信息
--keep-file-order (默认值) 保留输入文件排序
-S{N}, --segment-limit={N} 输出段限制 (默认值 N=1Mb)
-E{N}, --effort={N} 打包效果 (默认值 N=5)
-H{h}, --deflate-hint={h} 传输压缩提示: true, false 或 keep (默认值)
-m{V}, --modification-time={V} 传输 modtimes: latest 或 keep (默认值)
-P{F}, --pass-file={F} 传输未解压缩的给定输入元素
-U{a}, --unknown-attribute={a} 未知属性操作: error, strip 或 pass (默认值)
-C{N}={L}, --class-attribute={N}={L} (用户定义的属性)
-F{N}={L}, --field-attribute={N}={L} (用户定义的属性)
-M{N}={L}, --method-attribute={N}={L} (用户定义的属性)
-D{N}={L}, --code-attribute={N}={L} (用户定义的属性)
-f{F}, --config-file={F} 读取文件 F 的 Pack200.Packer 属性
-v, --verbose 提高程序详细程度
-q, --quiet 将详细程度设置为最低级别
-l{F}, --log-file={F} 输出到给定日志文件, 或对于 System.out 指定 '-'
-?, -h, --help 输出此消息
-V, --version 输出程序版本
-J{X} 将选项 X 传递给基础 Java VM

注:
-P, -C, -F, -M 和 -D 选项累计。
示例属性定义: -C SourceFile=RUH。
Config. 文件属性由 Pack200 API 定义。
有关 -S, -E, -H-, -m, -U 值的含义, 请参阅 Pack200 API。
布局定义 (例如 RUH) 由 JSR 200 定义。

重新打包模式通过打包/解包周期更新 JAR 文件:
pack200 [-r|--repack] [-opt | --option=value]... [repackedy.jar] y.jar

unpack200

将pack200(1)生成的打包文件转换为JAR文件以用于web部署。

1
2
3
4
5
6
7
8
9
10
11
Usage:  unpack200 [-opt... | --option=value]... x.pack[.gz] y.jar

Unpacking Options
-H{h}, --deflate-hint={h} override transmitted deflate hint: true, false, or keep (default)
-r, --remove-pack-file remove input file after unpacking
-v, --verbose increase program verbosity
-q, --quiet set verbosity to lowest level
-l{F}, --log-file={F} output to the given log file, or '-' for standard output (default)
-?, -h, --help print this message
-V, --version print program version
-J{X} Java VM argument (ignored)

Java Web启动工具

javaws

Java web启动工具

注意:javaws命令在oracle solaris上不可用。

javaws命令启动java web start,它是JNLP的参考实现。JavaWebStart启动网络上托管的Java应用程序和小程序。
如果指定了JNLP文件,那么javaws命令将启动JNLP文件中指定的Java应用程序或小程序。
javaws启动器有一组在当前版本中受支持的选项。但是,这些选项可能会在将来的版本中删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Java Web Start: 
用法: javaws [运行选项] <jnlp-file>
javaws [控制选项]

其中运行选项包括:
-verbose 显示其他输出内容
-offline 以脱机模式运行应用程序
-system 仅从系统高速缓存运行应用程序
-Xnosplash 运行时不显示启动屏幕
-J<选项> 为 vm 提供选项
-wait 启动 Java 进程并等待其退出

控制选项包括:
-viewer 在 Java 控制面板中显示高速缓存查看器
-clearcache 从高速缓存删除所有未安装的应用程序
-uninstall 从高速缓存删除所有应用程序
-uninstall <jnlp-file> 从高速缓存删除应用程序
-import [导入选项] <jnlp-file> 将应用程序导入高速缓存

导入选项包括:
-silent 以无提示模式 (不出现用户界面) 导入
-system 将应用程序导入系统高速缓存
-codebase <url> 从给定的代码库检索资源
-shortcut 以用户接受提示的方式安装快捷方式
-association 以用户接受提示的方式安装关联

快照性能监控管理工具

jcmd

jcmd实用程序用于向JVM发送诊断命令请求。它必须在运行JVM的同一台机器上使用,并且具有与启动JVM相同的有效用户和组标识符。

语法

1
2
3
4
5
6
7
jcmd [-l|-h|-help]

jcmd pid|main-class PerfCounter.print

jcmd pid|main-class -f filename

jcmd pid|main-class command[ arguments]

如果不带参数或使用-l选项运行jcmd,它将打印运行Java进程标识符的列表,其中包含用于启动进程的主类和命令行参数。使用-h或-help选项运行jcmd将打印工具的帮助消息。

jconsole

java信息监控控制台,具有图形界面,可直接操作,查看摘要、内存、线程、类、MBean,VM的信息。

jmc

JMC(Java Mission Control)是JDK提供的性能分析工具,主要包括7部分性能报告,分别是一般信息、内存、代码、线程、I/O、系统、事件。其中,内存、代码、线程及I/O是系统分析的主要部分。

高版本JDK已经将JMC和JVISUALVM从bin目录下移除,要使用的话需要单调下载

image.png
可以通过连接本地运行的Java应用或者打开文件进行分析,连接远程JVM的话需要远程的程序配置如下参数

1
2
3
-Dcom.sun.management.jmxremote.port=7091 
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

jvisualvm

一种图形化工具,当基于Java技术的应用程序(Java应用程序)在Java虚拟机中运行时,它提供有关这些应用程序的详细信息。JavaVisualVM提供内存和CPU分析、堆转储分析、内存泄漏检测、MBean访问和垃圾收集。有关更多信息,请参阅Java VisualVM。

image.png

Java web Service工具

schemagen

为Java类中引用的每个名称空间生成一个schema。

1
2
3
4
5
6
7
8
9
10
用法: schemagen [-options ...] <java files> 
选项:
-d <path> : 指定放置处理程序和 javac 生成的类文件的位置
-cp <path> : 指定查找用户指定文件的位置
-classpath <path> : 指定查找用户指定文件的位置
-encoding <encoding> : 指定用于注释处理/javac 调用的编码
-episode <file> : 生成片段文件以供单独编译
-version : 显示版本信息
-fullversion : 显示完整的版本信息
-help : 显示此用法消息

wsgen

读取web service endpoint实现(SEI)类,并生成web服务部署和调用所需的所有组件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
用法: WSGEN [options] <SEI>

\其中 [options] 包括:
-classpath <path> 指定查找输入类文件的位置
-cp <path> 与 -classpath <path> 相同
-d <directory> 指定放置生成的输出文件的位置
-encoding <encoding> 指定由源文件使用的字符编码
-extension 允许供应商扩展 - 不按规范
指定功能。使用扩展可能会
导致应用程序不可移植或
无法与其他实现进行互操作
-help 显示帮助
-keep 保留生成的文件
-r <directory> 资源目标目录, 指定放置
资源文件 (例如 WSDL) 的位置
-s <directory> 指定放置生成的源文件的位置
-verbose 有关编译器在执行什么操作的输出消息
-version 输出版本信息
-wsdl[:protocol] 生成 WSDL 文件。协议是可选的。
有效协议是[soap1.1, Xsoap1.2],
默认值为 soap1.1
非标准协议[Xsoap1.2]
只能与
-extension 选项结合使用。
-inlineSchemas 生成的 wsdl 中的内嵌模式。必须
与 -wsdl 选项结合使用。
-servicename <name> 指定要用在生成的 WSDL 中的服务名
与 -wsdl 选项结合使用。
-portname <name> 指定要用在生成的 WSDL 中的端口名
与 -wsdl 选项结合使用。

Extensions:
-Xnocompile do not compile generated Java files

\示例:
wsgen -cp . example.Stock
wsgen -cp . example.Stock -wsdl -servicename {http://mynamespace}MyService

wsimport

生成可以打包在web应用程序归档(WAR)文件中的JAX-WS可移植工件,并提供Ant任务。

wsimport命令生成以下JAX-WS可移植工件。这些构件可以打包在WAR文件中,其中包含WSDL和模式文档以及要部署的端点实现。wsimport命令还提供了wsimport Ant任务,请参见中wsimport Ant任务页的“工具”选项卡http://jax-ws.java.net/nonav/2.1.1/docs/wsimportant.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
用法: wsimport [options] <WSDL_URI>

\其中 [options] 包括:
-b <path> 指定 jaxws/jaxb 绑定文件或附加模式
(每个 <path> 都必须具有自己的 -b)
-B<jaxbOption> 将此选项传递给 JAXB 模式编译器
-catalog <file> 指定用于解析外部实体引用的目录文件
支持 TR9401, XCatalog 和 OASIS XML 目录格式。
-d <directory> 指定放置生成的输出文件的位置
-encoding <encoding> 指定源文件所使用的字符编码
-extension 允许供应商扩展 - 不按规范
指定功能。使用扩展可能会
导致应用程序不可移植或
无法与其他实现进行互操作
-help 显示帮助
-httpproxy:<host>:<port> 指定 HTTP 代理服务器 (端口默认为 8080)
-keep 保留生成的文件
-p <pkg> 指定目标程序包
-quiet 隐藏 wsimport 输出
-s <directory> 指定放置生成的源文件的位置
-target <version> 按给定的 JAXWS 规范版本生成代码
默认为 2.2, 接受的值为 2.0, 2.12.2
例如, 2.0 将为 JAXWS 2.0 规范生成兼容的代码
-verbose 有关编译器在执行什么操作的输出消息
-version 输出版本信息
-wsdllocation <location> @WebServiceClient.wsdlLocation 值
-clientjar <jarfile> 创建生成的 Artifact 的 jar 文件以及
调用 Web 服务所需的 WSDL 元数据。
-generateJWS 生成存根 JWS 实现文件
-implDestDir <directory> 指定生成 JWS 实现文件的位置
-implServiceName <name> 生成的 JWS 实现的服务名的本地部分
-implPortName <name> 生成的 JWS 实现的端口名的本地部分

\扩展:
-XadditionalHeaders 映射标头不绑定到请求或响应消息不绑定到
Java 方法参数
-Xauthfile 用于传送以下格式的授权信息的文件:
http://username:password@example.org/stock?wsdl
-Xdebug 输出调试信息
-Xno-addressing-databinding 允许 W3C EndpointReferenceType 到 Java 的绑定
-Xnocompile 不编译生成的 Java 文件
-XdisableAuthenticator 禁用由 JAX-WS RI 使用的验证程序,
将忽略 -Xauthfile 选项 (如果设置)
-XdisableSSLHostnameVerification 在提取 wsdl 时禁用 SSL 主机名
验证

\示例:
wsimport stock.wsdl -b stock.xml -b stock.xjb
wsimport -d generated http://example.org/stock?wsdl

xjc

将XML模式文件编译成完全带注释的Java类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
用法: xjc [-options ...] <schema file/URL/dir/jar> ... [-b <bindinfo>] ...
如果指定 dir, 将编译该目录中的所有模式文件。
如果指定 jar, 将编译 /META-INF/sun-jaxb.episode 绑定文件。
选项:
-nv : 不对输入模式执行严格验证
-extension : 允许供应商扩展 - 不严格遵循
JAXB 规范中的兼容性规则和应用程序 E.2
-b <file/dir> : 指定外部绑定文件 (每个 <file> 必须具有自己的 -b)
如果指定目录, 则将搜索 **/*.xjb
-d <dir> : 生成的文件将放入此目录中
-p <pkg> : 指定目标程序包
-httpproxy <proxy> : 设置 HTTP/HTTPS 代理。格式为 [user[:password]@]proxyHost:proxyPort
-httpproxyfile <f> : 作用与 -httpproxy 类似, 但在文件中采用参数来保护口令
-classpath <arg> : 指定查找用户类文件的位置
-catalog <file> : 指定用于解析外部实体引用的目录文件
支持 TR9401, XCatalog 和 OASIS XML 目录格式。
-readOnly : 生成的文件将处于只读模式
-npa : 禁止生成程序包级别注释 (**/package-info.java)
-no-header : 禁止生成带有时间戳的文件头
-target (2.0|2.1) : 行为与 XJC 2.02.1 类似, 用于生成不使用任何 2.2 功能的代码。
-encoding <encoding> : 为生成的源文件指定字符编码
-enableIntrospection : 用于正确生成布尔型 getter/setter 以启用 Bean 自测 apis
-contentForWildcard : 为具有多个 xs:any 派生元素的类型生成内容属性
-xmlschema : 采用 W3C XML 模式处理输入 (默认值)
-relaxng : 采用 RELAX NG 处理输入 (实验性的, 不支持)
-relaxng-compact : 采用 RELAX NG 简洁语法处理输入 (实验性的, 不支持)
-dtd : 采用 XML DTD 处理输入 (实验性的, 不支持)
-wsdl : 采用 WSDL 处理输入并编译其中的模式 (实验性的, 不支持)
-verbose : 特别详细
-quiet : 隐藏编译器输出
-help : 显示此帮助消息
-version : 显示版本信息
-fullversion : 显示完整的版本信息


扩展:
-Xinject-code : inject specified Java code fragments into the generated code
-Xlocator : enable source location support for generated code
-Xsync-methods : generate accessor methods with the 'synchronized' keyword
-mark-generated : mark the generated code as @javax.annotation.Generated
-episode <FILE> : generate the episode file for separate compilation
-Xpropertyaccessors : Use XmlAccessType PROPERTY instead of FIELD for generated classes

监控工具

jps

列出目标系统上已检测的Java虚拟机(JVM)
格式:

1
jps [ options ] [ hostid ]

Options

-q:抑制传递给main方法的类名、JAR文件名和参数的输出,只生成本地JVM标识符列表。
-m:显示传递给main方法的参数。对于嵌入式JVM,输出可能为空。
-l:显示应用程序主类的完整包名或应用程序JAR文件的完整路径名。
-v:显示传递给JVM的参数。
-V:抑制传递给main方法的类名、JAR文件名和参数的输出,只生成本地JVM标识符列表。
-Joption:将选项传递给JVM,其中option是Java应用程序启动程序的参考页上描述的选项之一。例如,-J-Xms48m将启动内存设置为48mb。

Host Identifier

主机标识符或hostid是一个表示目标系统的字符串。hostid字符串的语法对应于URI的语法:

1
[protocol:][[//]hostname][:port][/servername] 

protocol:
通信协议。如果省略了协议并且没有指定主机名,那么默认协议是特定于平台的、优化的本地协议。如果省略协议并指定主机名,则默认协议为rmi。
hostname:
表示目标主机的主机名或IP地址。如果省略hostname参数,则目标主机是本地主机。
port:
与远程服务器通信的默认端口。如果省略hostname参数或protocol参数指定优化的本地协议,则忽略port参数。否则,端口参数的处理是特定于实现的。对于默认的rmi协议,port参数表示远程主机上rmi注册表的端口号。如果省略port参数,并且protocol参数指示rmi,则使用默认的rmiregistry端口(1099)。
servername:
此参数的处理取决于实现。对于优化的本地协议,忽略此字段。对于rmi协议,此参数是一个字符串,表示远程主机上rmi远程对象的名称。有关更多信息,请参见jstatd命令-n选项。

Output Format

jps命令的输出遵循以下模式:

1
lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ] 

所有输出标记都用空格隔开。包含嵌入空格的arg值在尝试将参数映射到其实际位置参数时会引入歧义。

jstat

监视Java虚拟机(JVM)统计信息。
jstat命令显示已检测Java热点VM的性能统计信息。目标JVM由其虚拟机标识符或vmid选项标识。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:
<option> An option reported by the -options option
<vmid> Virtual Machine Identifier. A vmid takes the following form:
<lvmid>[@<hostname>[:<port>]]
Where <lvmid> is the local vm identifier for the target
Java virtual machine, typically a process id; <hostname> is
the name of the host running the target Java virtual machine;
and <port> is the port number for the rmiregistry on the
target host. See the jvmstat documentation for a more complete
description of the Virtual Machine Identifier.
<lines> Number of samples between header lines.
<interval> Sampling interval. The following forms are allowed:
<n>["ms"|"s"]
Where <n> is an integer and the suffix specifies the units as
milliseconds("ms") or seconds("s"). The default units are "ms".
<count> Number of samples to take before terminating.
-J<flag> Pass <flag> directly to the runtime system.

案例:

1
2
3
4
5
6
7
8
9
10
11
jstat –class <pid> : 显示加载class的数量,及所占空间等信息。
jstat -compiler <pid>显示VM实时编译的数量等信息。
jstat -gc <pid>: 可以显示gc的信息,查看gc的次数,及时间。
jstat -gccapacity <pid>:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
jstat -gcutil <pid>:统计gc信息
jstat -gcnew <pid>:年轻代对象的信息。
jstat -gcnewcapacity<pid>: 年轻代对象的信息及其占用量。
jstat -gcold <pid>:old代对象的信息。
jstat -gcoldcapacity <pid>: old代对象的信息及其占用量。
jstat -gcpermcapacity<pid>: perm对象的信息及其占用量。
jstat -printcompilation <pid>:当前VM执行的信息。

jstatd

监视Java虚拟机(JVM),并启用远程监视工具来连接到JVM。

jstatd命令是一个RMI服务器应用程序,它监视插入指令的Java热点vm的创建和终止,并提供一个接口,使远程监视工具能够连接到本地主机上运行的jvm。jstatd服务器需要本地主机上的RMI注册表。jstatd服务器尝试在默认端口或使用-p port选项指定的端口上连接到RMI注册表。如果未找到RMI注册表,则会在jstatd应用程序中创建一个注册表,该注册表绑定到-p port选项指示的端口,或者在省略-p port选项时绑定到默认RMI注册表端口。通过指定-nr选项,可以停止创建内部RMI注册表。

选项

-nr:当找不到现有的RMI注册表时,不尝试在jstatd进程中创建内部RMI注册表。
-p post:预期将在其中找到RMI注册表的端口号,如果未指定-nr选项,则在未找到时创建该端口号。
-n rminame:远程RMI对象在RMI注册表中绑定到的名称。默认名称是JStatRemoteHost。如果在同一台主机上启动多个jstatd服务器,则可以通过指定此选项使每个服务器的导出RMI对象的名称唯一。但是,这样做需要在监视客户端的hostid和vmid字符串中包含唯一的服务器名称。
-Jopiton:将选项传递给JVM,其中option是Java应用程序启动程序的参考页上描述的选项之一。例如,-J-Xms48m将启动内存设置为48mb。
1.启动RMI服务
1.1在JAVA_HOME目录下创建jstatd.all.policy 文件

1
2
3
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};

1.2启动

1
2
3
jstatd -J-Djava.security.policy=jstatd.all.policy
#或者
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=服务器IP

快照工具

jinfo

生成配置信息。

jinfo命令打印指定Java进程或核心文件或远程调试服务器的Java配置信息。配置信息包括Java系统属性和Java虚拟机(JVM)命令行标志。如果指定的进程在64位JVM上运行,则可能需要指定-J-d64选项,例如:jinfo-J-d64-sysprops pid。

此实用程序不受支持,在JDK的未来版本中可能不可用。在不存在dbgeng.dll的Windows系统中,必须安装Windows调试工具才能使这些工具正常工作。PATH环境变量应包含目标进程使用的jvm.dll的位置或生成崩溃转储文件的位置。例如,set PATH=%JDK\HOME%\jre\bin\client;%路径%。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Usage:
jinfo [option] <pid>
(to connect to running process)
jinfo [option] <executable <core>
(to connect to a core file)
jinfo [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)

where <option> is one of:
-flag <name> to print the value of the named VM flag
-flag [+|-]<name> to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
-flags to print VM flags
-sysprops to print Java system properties
<no option> to print both of the above
-h | -help to print this help message

jhat

主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
第一步:导出堆

1
2
3
4
#查看Java程序对应的pid
jps -lm
#导出堆信息
jmap -dump:live,file=a.log pid

除了使用jmap命令,还可以通过以下方式:
1、使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成dump文件)、
2、虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError 时, 会自动执行堆转储。
3、使用 hprof 命令

第二步:分析堆文件

1
jhat -J-Xmx512M a.log

说明:有时dump出来的堆很大,在启动时会报堆空间不足的错误,可加参数:jhat -J-Xmx512m 。这个内存大小可根据自己电脑进行设置。

解析Java堆转储文件,并启动一个 web server

image.png

第三步:查看html
http://ip:7000/
image.png

jmap

jmap命令打印指定进程、核心文件或远程调试服务器的共享对象内存映射或堆内存详细信息。如果指定的进程在64位Java虚拟机(JVM)上运行,则可能需要指定-J-d64选项,例如:

1
jmap -J-d64 -heap pid

用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)

where <option> is one of:
<none> to print same info as Solaris pmap
-heap to print java heap summary
-histo[:live] to print histogram of java object heap; if the "live"
suboption is specified, only count live objects
-clstats to print class loader statistics
-finalizerinfo to print information on objects awaiting finalization
-dump:<dump-options> to dump java heap in hprof binary format
dump-options:
live dump only live objects; if not specified,
all objects in the heap are dumped.
format=b binary format
file=<file> dump heap to <file>
Example: jmap -dump:live,format=b,file=heap.bin <pid>
-F force. Use with -dump:<dump-options> <pid> or -histo
to force a heap dump or histogram when <pid> does not
respond. The "live" suboption is not supported
in this mode.
-h | -help to print this help message
-J<flag> to pass <flag> directly to the runtime system

出现权限问题运行 echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 即可

jsadebugd

jsadebugd命令附加到Java进程或核心文件,并充当调试服务器。远程客户端(如jstack、jmap和jinfo)可以通过Java远程方法调用(RMI)连接到服务器。在启动jsadebugd命令之前,使用rmiregistry命令启动RMI注册表,如下所示,$JAVA_HOME是JDK安装目录:

1
rmiregistry -J-Xbootclasspath/p:$JAVA_HOME/lib/sajdi.jar

如果RMI注册表没有启动,那么jsadebugd命令会在内部启动标准(1099)端口中的RMI注册表。可以通过向调试服务器发送SIGINT来停止调试服务器。要发送信号,请按Ctrl+C。

1
2
3
4
5
6
7
8
Usage: jsadebugd [options] <pid> [server-id]
(to connect to a live java process)
or jsadebugd [options] <executable> <core> [server-id]
(to connect to a core file produced by <executable>)
server-id is an optional unique id for this debug server, needed
if multiple debug servers are run on the same machine
where options include:
-h | -help to print this help message

jstack

jstack命令为指定的Java进程、核心文件或远程调试服务器打印Java线程的Java堆栈跟踪。对于每个Java帧,打印完整的类名、方法名、字节码索引(BCI)和行号(如果可用)。使用-m选项,jstack命令可以用程序计数器(PC)打印所有线程的Java和本机帧。对于每个本机帧,打印与PC最近的本机符号(如果可用)。C++的名字并不是散乱的。若要删除C++名称,则可以将此命令的输出管道连接到C++ + FLT。当指定的进程在64位Java虚拟机上运行时,可能需要指定-J-d64选项,例如:

1
jstack -J-d64-m pid

用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)

Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message

脚本工具

jjs

jjs命令行工具用于调用Nashorn引擎。您可以使用它来解释一个或多个脚本文件,或者运行交互式shell。

格式

1
jjs [options] [script-files] [-- arguments]

更多参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jjs.html

jrunscript

jrunscript命令是一个独立于语言的命令行脚本shell。jrunscript命令支持交互式(read eval print)模式和批处理(-f选项)模式的脚本执行。默认情况下,JavaScript是使用的语言,但是-l选项可用于指定不同的语言。通过使用Java到脚本语言的通信,jrunscript命令支持探索性编程风格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Usage: jrunscript [options] [arguments...]

where [options] include:
-classpath <path> Specify where to find user class files
-cp <path> Specify where to find user class files
-D<name>=<value> Set a system property
-J<flag> Pass <flag> directly to the runtime system
-l <language> Use specified scripting language
-e <script> Evaluate given script
-encoding <encoding> Specify character encoding used by script files
-f <script file> Evaluate given script file
-f - Interactive mode, read script from standard input
If this is used, this should be the last -f option
-help Print this usage message and exit
-? Print this usage message and exit
-q List all scripting engines available and exit

If [arguments..] are present and if no -e or -f option is used, then first
argument is script file and the rest of the arguments, if any, are passed
as script arguments. If [arguments..] and -e or -f option is used, then all
[arguments..] are passed as script arguments. If [arguments..], -e, -f are
missing, then interactive mode is used.

资料

官方介绍:https://docs.oracle.com/javase/8/docs/technotes/tools/
jdk的bin目录详解:https://blog.csdn.net/iteye_1194/article/details/82435484


性能调优-JDK Bin目录工具介绍及使用
https://mikeygithub.github.io/2021/07/22/yuque/性能调优-JDK Bin目录工具介绍及使用/
作者
Mikey
发布于
2021年7月22日
许可协议