[Java Platform, Standard Edition Tools Reference] 第四章



Command Reference

原文地址:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/intro.html#sthref17 

appletviewer
    Java applet 浏览器。appletviewer 命令可在脱离万维网浏览器环境的情况下运行 applet
例子:

 通过javac编译这个java文件,就会在同目录生成AppletViewerTest.class。然后到src文件夹中新建一个html文件AppletViewerTest.html,如下:

<html>
<body>
    <applet code="com.lhb.practice.jse.AppletViewerTest.class" height=200 width=300>
    </applet>
</body>
</html>
 

然后通过命令行切换到src目录下,执行

E:\java-practice\src>appletviewer AppletViewerTest.html
#注意:AppletViewerTest.html的位置一定要是html中code中指定的java类所在包的上一级目录。比如这里的com的上一级就是src。所以AppletViewerTest.html建在了src目录下。否则容易出现找不到类的问题

就会出现结果如下:


extCheck
使用场景:你有一个jar文件想放到sdk的ext文件夹中,现在你想看你的这个jar在ext中是否已存在或者是否与ext所在的这个JDK版本是否相同,就可以使用这个命令。
原理是:将目标JAR文件清单中的Specification-titleSpecification-version标头与当前安装在扩展目录中的所有JAR文件中的对应标头进行比较。默认情况下,扩展目录路径为:jre/lib/ext
例子:

 Test.java代码

package com.lhb.practice.jse;

public class Test {
   public static void main(String [] args) {
     System.out.println("Hello World " );
   }
}

Manifest.xml内容 

Manifest-Version: 1.0
Main-Class: com.lhb.practice.jse.Test
Specification-title: Java Platform API Specification
Specification-version: 1.6

这里必须有Specification-title和Specification-version,因为与ext中每个jar比较时,用的就是这两个东东。

运行及结果:

 extcheck后面跟的是你自己的jar文件,然后命令会自动去ext文件夹下比较文件夹中的每个jar。
我的这个jar是在桌面。
注意:如果出现我这个IO Exception occurred说明ext文件夹下面含有非jar的文件,要把这些文件先挪出去。

jar
用于操作jar文件,例如将一个class文件打包成jar文件,更新jar中的文件。我们平时通过idea生成jar文件,或者eclipse生成jar文件时,其实最终都是通过jar这个命令来完成的。
jar的一些参数如下:

例子:
将在Test.class打包成jar文件。因为我的Test.class文件是包含包的,所以我们要在包的根目录进行命令操作,先看一下包结构:

 com文件夹是包的根目录,所以在com文件夹所在的地方打开命令行,如下:

 

 在这个目录打开cmd,然后通过jar命令打包class文件到jar中,如下:

C:\Users\liuhb\Desktop\java-practice>jar -cvfm test.jar ./META-INF/manifest.mf .
マニフェストが追加されました
com/を追加中です(入=0)(出=0)(0%格納されました)
com/lhb/を追加中です(入=0)(出=0)(0%格納されました)
com/lhb/practice/を追加中です(入=0)(出=0)(0%格納されました)
com/lhb/practice/jse/を追加中です(入=0)(出=0)(0%格納されました)
com/lhb/practice/jse/MANIFEST.MFを追加中です(入=184)(出=137)(25%収縮されました)
com/lhb/practice/jse/Test.classを追加中です(入=701)(出=417)(40%収縮されました)
エントリMETA-INF/を無視します
エントリMETA-INF/MANIFEST.MFを無視します

我这是日语系统,操作后出现的这些信息就是说在这打包的反馈信息,可以忽略。最后就会在当前目录生成一个test.jar文件。
讲解:
通过-m和./META-INF/manifest.mf来制定manifest文件的位置,必须要有这个文件,否则报错。最后一个点(.)表示当前目录下的所有class打包进入test.jar中,就会在当前目录生成一个test.jar,如下:

java
这个大家都常用,就是用来执行java应用的,例如执行一个jar包,执行一个class文件,因为太简单,这里就不多说了。

javac
同样也是很常用的命令,就是将一个.java文件编译为.class文件,百度上全都是用法,就不多少了。

javadoc
这个主要用于将我们类和方法上写的注释(下图红色部分),生成一个html的api说明

 生成后的样子就跟java官网api中的样子是一样的。就可以通过html看到我们注释中写的东西了。

javah
命令中的h的意思就是生成一个c语言中的.h头文件,这个命令主要是把我们代码中含有native关键字的类生成一个对应的.h文件,有了这个文件后,就可以通过c语言编写对应的方法,然后导入这个.h文件,然后生成一个dll,最后java中就会调用这个文件,如果有不明白的可以百度JNI相关内容。

javap
反编译命令,可以将我们的.class文件反编译成源文件.java文件。就跟工具jad一个效果

jdb
jdb就是java debugger的意思。我们平时开发中都是通过IDE然后一步一步通过鼠标或者键盘来进行断点调试。jdb的作用也是如此,只不过他是在命令行,我们要通过出入特定的命令来进行例如显示某个变量的值,让断点向下执行一行等等

keytool
它是一个安全相关的管理工具,主要用于秘钥,证书的管理。比如他可以生成证书,公钥和私钥。
Keytool 将密钥(key)和证书(certificates)存在一个称为keystore的文件中。在keystore里,包含两种数据:
(1)密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)
(2)可信任的证书实体(trusted certificate entries)——只包含公钥

应用场景:比如当你需要创建https的请求时,你就可以通过keytool工具创建安全证书,然后放到tomcat中。

jarsigner
一个用来给jar进行签名的工具和校验的工具。通过校验签名主要是为了安全的考虑,比如你为了保证甲方给你的一个jar包没有被其他人动过手脚,那么你就可以通过这个命令验证一下里面的签名是否正确。下面通过一个例子来说明如果通过这个工具来给jar进行签名:
例子:
现在桌面上又一个jar包名字为:java-practice.jar,然后对其进行签名。

签名一般需要进行两步:
第一步:通过结合上面的keytool先生成秘钥
cmd到桌面,然后输入输入命令

C:\Users\liuhb\Desktop>keytool -genkey -alias mystore -keypass j638klm -keyalg RSA -keysize 1024 -validity 365 -keystore mystore.keystore -storepass myspass

第二步:使用秘钥在进行签名

C:\Users\liuhb\Desktop>jarsigner -keystore mystore.keystore -storepass myspass -keypass j638klm -signedjar sJavaPractice.jar java-practice.jar mystore

这里需要注意的是最后三个参数:
sJavaPractice.jar是签名后生成的jar包的名字
java-practice.jar是原始的jar包的名字
mystore:一个别名,表示在keystore这个库里面找mystore这个别名对应的那个签名和相关的东西。(因为一个keystore里面,有可能存放着keytool生成的好多东西,通过别名可以知道要用哪一个)

最后我用一张图说明一下2个工具命令中必须对应的关键点

 例子2:
上面进行了签名,下面我们就来看如何进行验证签名,从而知道这个jar是否被别人恶意修改过。
cmd到桌面,然后执行命令:

C:\Users\liuhb\Desktop>jarsigner -verify sJavaPractice.jar
jarが検証されました。

这就说明验证通过了。


policytool
这个命令跟java中的Security有关(不是spring中的security昂,别混了)。比如你写的java代码中用到了反射,用到socket,那么你在运行代码时,你是否有权使用反射来执行一个方法呢,你是否有权利使用socket来通信呢,这些都是与java的Security相关的,这些被称为权限permission,他们被写在C:\Program Files\Java\jdk1.8.0_51\jre\lib\security\java.policy的文件中,你可以直接通过修改这个文件来设置权限,或者自定义一个policy然后通过运行java时指定一下也行。
由于编写这个文件太复杂,所以就有了policytool这个命令,这个命令会直接打开一个窗体,然后你可以在窗体中进行编写。窗体如下:

具体关于这个东西的使用详情,以及关于policy的使用例子,可以参考下面我引用其他博主的,也可以看我写的,因为篇幅问题,就不在这写了。
自定义java.policy配置(如何让你的类禁止读写文件?禁止创建Socket对象?)_smart pig的专栏-CSDN博客

 native2ascii
这是一个国际化的工具,主要用于中文或者其他的编码转为java默认的unicode码,举个例子,很多时候代码中都会读取property文件,这个文件中有可能放着你写的一些内容,假如现在里面有中文,那么你有可能读出来后就会是乱码,这时候你就可以把这个property文件中的所有中文用unicode编码的形式表示,这样就不会出现乱码了。怎么转成unicode编码呢,就用这个工具就行。样子如下:

 下面这3个命令都是跟RMI(Remote Method Invocation)有关的
先说一下什么是RMI,RMI就是你的工程想调用别人工程中的一个方法,别人的工程不在你本地,是在远程,专业点就是能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。
rmic
rmiregistry
rmid
serialver

 

javaws
这个命令跟jnlp有关,jnlp是java提供的一种让你可以通过浏览器直接执行java应用程序的途径,它使你可以直接通过一个网页上的url连接打开一个 java应 用程序。通过javaws可以启动jnlp的web程序。

jconsole
用于通过视图的方式来监控我们的application,如下,输入命令后,会弹出框,让你选择要监视的程序,这里可以看到idea也作为application被放在了下拉菜单中

连接之后,你就会在窗口中看到很多监控的信息了。

jvisualvm
也是一个可视化的观察我们程序性能的工具,它海带可以连见到远程来观察性能问题。


在这个工具中,你可以观察RMI,线程,内存,CPU等信息

 jps(Java Virtual Machine Process Status Tool)
这是个用来查看所有java进程的pid的,通过它来查看我们到底启动了几个java进程。

 6908就是我idea的进程,6908就是PID,知道了pid,你就可以kill了

jstat
监控JVM的状态,例如查看堆内存各部分的使用量,以及加载类的数量,堆内存统计,垃圾回收等统计信息。

例子:
上面我们用jps看到了idea的pid,那么我们现在用jstat然后跟上idea的pid来看一下idea的状态

C:\Users\liuhb\Desktop>jstat -class 6908
Loaded  Bytes  Unloaded  Bytes     Time
 3873   7196.3    29     41.7       6.45

讲解:
-class表示看类相关的信息,6908是idea的pid,Loaded是加载class的数量, Bytes是所占用空间大小, Unloaded是未加载数量, Bytes是未加载占用空间, Time是时间

jstatd
jstat这个工具守护进程,主要用于监控JVM的创建与终止,并提供一个接口允许远程监控工具依附到在本地主机上运行的JVM.意思就是用了这个命令,就会开启一个守护进程,然后在别的地方就可以远程到这个电脑,来观察远程电脑上jstat命令同样的统计了。
一般都是通过jvisualvm中的【远程】配合jstatd命令,就可以在jvisualvm中看到远程某个机器上所有的java进程了。

例子:
在远程服务器上使用jstatd工具,开启一个jstat守护进程,然后在本地通过jvisualvm工具中的【远程】添加服务器的地址,然后就可以看到服务器上的java相关的状态了。等同于在服务器上执行jstat命令。
首先,在远程服务器LInux的/usr/local下面创建一个jstatd.all.policy文件,命令如下:

vim jstatd.all.policy

然后,把下面的内容粘贴进去​​​​

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

这个内容上面policy相关的内容,主要是释放权限,否则会出现下面的异常:

access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.System.setProperty(System.java:727)
        at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)

最后,在/usr/local目录下执行命令:

jstatd -J-Djava.security.policy=jstatd.all.policy

如果没出任何东西,表示成功了。

这时,我们在本地机器上通过j打开visualvm工具,然后在里面的【远程】添加刚才远程机器的ip,就可以看到内容了。

jmc(java mission control)
它也是JVM的一套监控和管理工具,跟jvisualvm差不多,并且也可以远程连接到其他机器,查看远程机器的jvm状态。在这个工具里,你可以看到所有java的程序进程,比如idea的,tomcat的(必须启动昂)的统计情况。

 下面的命令是跟web service相关的
schemagen
这个工具就是将你定义的一个类,转成一个xsd文件
wdgen
生成web service需要的文件
wsimport
根据wsdl文件生成中间代码
xjc
将xsd文件变成java文件

下面的命令主要用于调试用
jcmd
发送诊断命令请求到正在运行的Java虚拟机(JVM)。它必须和JVM运行在同一台机器上,并且与启动JVM用户具有相同的组权限。
例子:
比如,我先查看当前jvm上启动的哪些java进程

C:\Users\liuhb\Desktop>jcmd -l
6128
22140 sun.tools.jcmd.JCmd -l
6908 org.jetbrains.jps.cmdline.Launcher

然后我想看6908这个pid(我的idea)的启动时间

C:\Users\liuhb\Desktop>jcmd 6908 VM.uptime
6908:
74529.562 s

如果还想看其他的,使用下面表格中的命令

jcmd PID VM.uptime查看 JVM 的启动时长
jcmd PID GC.class_histogram查看 JVM 的类信息,这个可以查看每个类的实例数量和占用空间大小。
jcmd PID Thread.print查看 JVM 的Thread Dumpjcmd PID GC.heap_dump FILE_NAME查看 JVM 的Heap Dump,注意,如果只指定文件名,默认会生成在启动 JVM 的目录里。
jcmd PID VM.system_properties查看 JVM 的属性信息
jcmd PID VM.flags查看 JVM 的启动参数,注意,可以看到 -X 和 -XX 的参数信息
jcmd PID VM.command_line查看 JVM 的启动命令行
jcmd PID GC.run_finalization对 JVM 执行 java.lang.System.runFinalization(),尽量b别去调用这个对象的finalize方法。
jcmd PID GC.run对 JVM执行 java.lang.System.gc(),告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的
jcmd PID PerfCounter.print查看 JVM 的性能

jinfo 
用来查看 Java 进程运行的 JVM 参数
例子:
先用jps找到一个要观察的java进程,这里我们来看我们的idea的

C:\Users\liuhb\Desktop>jps
6128
22168 Jps
6908 Launcher #这个是idea的

然后通过jinfo来观察

C:\Users\liuhb\Desktop>jinfo 6908
Attaching to process ID 6908, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.51-b03
Java System Properties:

java.vendor = Oracle Corporation
preload.project.path = E:/cany/java-practice
sun.java.launcher = SUN_STANDARD
idea.config.path = C:\Users\liuhb\.IntelliJIdea2018.1\config
sun.management.compiler = HotSpot 64-Bit Tiered Compilers

这个命令会打印出很多数据,关于idea在jvm中的信息。

jhat(Java Heap Analysis Tool
主要是用来分析java堆的命令,可以用jhat命令将dump出来的hprof文件转成html的形式,然后通过http访问可以查看堆情况,包括对象的数量,大小等等,并支持对象查询语言。比如异常了,你就可以异常相关的堆信息打印出来
具体可参考这篇文章:JVM学习笔记——jhat的使用 - 简书

jmap
可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
例子:
首先,执行我们的java代码

public class Test {
   public static void main(String [] args) throws  Exception{
     while (true) {
       TimeUnit.SECONDS.sleep(20);
     }
   }
}

然后通过jps查看pid
 

C:\Users\liuhb\Desktop>jps
6128
8148 Test #我们上面运行的代码
17608 Jps
21528 Launcher

然后将这个代码的堆信息打印出来 

C:\Users\liuhb\Desktop>jmap -heap 8148
Attaching to process ID 8148, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.51-b03

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2111832064 (2014.0MB)
   NewSize                  = 44040192 (42.0MB)
   MaxNewSize               = 703594496 (671.0MB)
   OldSize                  = 88080384 (84.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 33554432 (32.0MB)
   used     = 4030264 (3.8435592651367188MB)
   free     = 29524168 (28.15644073486328MB)
   12.011122703552246% used
From Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation
   capacity = 88080384 (84.0MB)
   used     = 0 (0.0MB)
   free     = 88080384 (84.0MB)
   0.0% used

关于更多的使用可以参考这位博主:jvm 性能调优工具之 jmap - 简书

 jsdebugd
看到末尾的d,就知道他是一个守护进程,这个工具的作用就是当你有一个已经运行的程序,你想debug一下,这时就可以使用这个命令attach进去(强行就如到程序中),然后执行在使用前面说的jdb工具,就可以来进行debug操作了。
例子:
还是运行上面的Test代码,然后用jps找到对应的pid,然后通过jsdebugd开启这个debug的守护进程。

C:\Users\liuhb\Desktop>jsadebugd 8148
Attaching to process ID 8148 and starting RMI services, please wait...
Debugger attached and RMI services started.

然后再开一个cmd,使用jdb工具来进行debug,一行一行调试我们的代码。

C:\Users\liuhb>jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

jstack
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:
例子:
先运行一下java代码

public class Test {
   public static void main(String [] args) throws  Exception{
     while (true) {
       TimeUnit.SECONDS.sleep(20);
       sayHello();
     }
   }

   private static void  sayHello(){
     System.out.println("hello");
   }

然后用jps查看这个代码运行时的pid,然后执行jstack命令,打印出堆栈信息

C:\Users\liuhb\Desktop>jstack -l 21804 > jstack.txt  #21804就是pid

jrunscript
是一种脚本的外壳,就是通过这个命令你可以执行其他语言的语句,比如执行javascript(默认),可以预先写好代码,然后用这个工具在执行,也可以交互式,执行。
下面例子通过交互式方式演示:

C:\Users\liuhb\Desktop>jrunscript
nashorn> print("Hello world");
Hello world
nashorn> print(10+10)
20
nashorn>

以上为本节索引内容,本篇文章不在于详细介绍每个工具,关于各个工具的详细使用和介绍,会在后面通过专门文章介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值