一、javac
javac是用来编译.java文件的。将.java源文件编译为.class文件。
1.用法: 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 出现警告时终止编译
@<文件名> 从文件读取选项和文件名
2.简单使用
javac -d destdir srcFile
其中:1、-d destdir是用来指定存放编译生成的.class文件的路径。(若此选项省略,那么默认在当前目录下生成.class文件,并且没有生成包文件夹;当前目录可以用“.”来表示,即:javac -d . srcFile )
注意:添加-d选项除了可以指定编译生成的.class文件的路径外,最大的区别是可以将源文件首行的package关键字下的包名在当前路径下生成文件夹。
srcFile是源文件.java文件的路径。
例如:有这样一个简单的java类,路径为E:\test\JavacTest.java:
代码如下:
public class JavacTest {
public static void main(String[] args) {
byte a = 5;
short b = 6;
System.out.println("JavacTest [a=" + a + ", b=" + b + "]");
}
}
当前路径下,输入 javac JavacTest.java ,便在当前路径下生成了一个JavacTest.class的文件,如图:
注意:JavacTest.java是一个首行标注了package的java文件,而此时它在硬盘上的目录并未对应它的包名,所以,使用java com.stopTalking.test.JavacTest运行时是无法找到该java的。
若输入,javac –d . JavacTest.java ,那么生成的JavacTest.class便在当前目录下生成的包文件中了,如图:
二、java
运行一个.class或者.jar文件,产生运行效果。
1:用法: 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 输出产品版本并退出
-showversion 输出产品版本并继续
-? -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> 使用指定的图像显示启动屏幕
2.简单使用(运行Work1.class文件,不要写.class后缀!!)
总结:使用简单的java命令运行一个.class文件,不仅需要使用该类的全限定类名,而且需要在当前路径下有该类的包层次文件夹。这必须要求编译时使用-d选项。否则需要自己来建立包层次文件夹。
三:jstat
可以查看堆内存各部分的使用量,以及加载类的数量。
1.用法: jstat [options] VMID [interval] [count]
[options] : 操作参数,一般使用 -gcutil 查看gc情况
VMID : 本地虚拟机进程ID,即当前运行的java进程号
[interval] : 连续输出的时间间隔,单位为秒或者毫秒
[ count] : 连续输出的次数,如果缺省打印无数次
option 参数总览:
Option | Displays |
class | 类加载的行为统计。Statistics on the behavior of the class loader. |
compiler | HotSpt JIT编译器行为统计。Statistics of the behavior of the HotSpot Just-in-Time compiler. |
gc | 垃圾回收堆的行为统计。Statistics of the behavior of the garbage collected heap. |
gccapacity | 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计。Statistics of the capacities of the generations and their corresponding spaces. |
gcutil | 垃圾回收统计概述(百分比)。Summary of garbage collection statistics. |
gccause | 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and |
gcnew | 新生代行为统计。Statistics of the behavior of the new generation. |
gcnewcapacity | 新生代与其相应的内存空间的统计。Statistics of the sizes of the new generations and its corresponding spaces. |
gcold | 年老代和永生代行为统计。Statistics of the behavior of the old and permanent generations. |
gcoldcapacity | 年老代行为统计。Statistics of the sizes of the old generation. |
gcpermcapacity | 永生代行为统计。Statistics of the sizes of the permanent generation. |
printcompilation | HotSpot编译方法统计。HotSpot compilation method statistics. |
四:appletviewer:
小程序浏览器,一种执行HTML文件上的Java小程序类的Java浏览器 ,用的特别少,在这里就不做详细介绍了。
五:javadoc:
根据Java源代码及其说明语句生成的HTML文档。
1.用法: javadoc [options] [packagenames] [sourcefiles] [@files]
2.参数(部分)
-overview <file> 从 HTML 文件读取概览文档
-public 仅显示 public 类和成员
-protected 显示 protected/public 类和成员 (默认值)
-package 显示 package/protected/public 类和成员
-private 显示所有类和成员
-help 显示命令行选项并退出
。。。
通过标准 doclet 提供: doclet可以代替javadoc的输出,借由javadoc可以获取源码几乎所有的信息,类名、类变量、类方法、方法参数、注解、javadoc注释等都可以获取到,然后根据自己的需要把关心的信息输出成自定的格式。
-d <directory> 输出文件的目标目录
-use 创建类和程序包用法页面
-version 包含 @version 段
-author 包含 @author 段
-docfilessubdirs 递归复制文档文件子目录
。。。
3.简单使用(创建仅显示 public 类和成员的Work1.java的javadoc文档,存放在当前目录下的Work1_Javadoc目录中)
产生的文件如下图所示,功能还是挺强大的,当然使用doclet也可以自定义doc格式。
六:jdb:
Java调试器,可以逐行地执行程序、设置断点和检查变量。
1.用法: jdb <options> <class> <arguments>
<class> 是要开始调试的类的名称
<arguments> 是传递到 <class> 的 main() 方法的参数
2.<options>各种参数
-help 输出此消息并退出
-sourcepath <由 ";" 分隔的目录> 要在其中查找源文件的目录
-attach <address> 使用标准连接器附加到指定地址处正在运行的 VM
-listen <address> 等待正在运行的 VM 使用标准连接器在指定地址处连接
-listenany 等待正在运行的 VM 使用标准连接器在任何可用地址处连接
-launch 立即启动 VM 而不是等待 'run' 命令
-listconnectors 列出此 VM 中的可用连接器
-connect <connector-name>:<name1>=<value1>,... 使用所列参数值通过指定的连接器连接到目标 VM
-dbgtrace [flags] 输出信息供调试jdb
-tclient 在 HotSpot(TM) 客户机编译器中运行应用程序
-tserver 在 HotSpot(TM) 服务器编译器中运行应用程序
转发到被调试进程的选项:
-v -verbose[:class|gc|jni] 启用详细模式
-D<name>=<value> 设置系统属性
-classpath <由 ";" 分隔的目录> 列出要在其中查找类的目录
-X<option> 非标准目标 VM 选项
3.简单使用(debug Work1,要有Work1.class文件才可以,写文件名的时候不用写后缀名,不然会报错!)‘
进入jdb后,输入各种参数进行调试。在此期间会启动 vm(虚拟机)执行这段代码!
七:javah:
产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
Javah获取您的Java源文件并生成C头文件,其中包含您的Java代码中所有本机方法的JNI存根(stub)。如果您正在生成一个类的JNI存根,而且您已经把这个类定义为包的一部分,那么您必须指定完全限定的类名。
1.用法: javah [options] <classes>
<classes> 是使用其全限定名称指定的 (例如, java.lang.Object)。
其中, [options] 包括:
-o <file> 输出文件 (只能使用 -d 或 -o 之一)
-d <dir> 输出目录
-v -verbose 启用详细输出
-h --help -? 输出此消息
-version 输出版本信息
-jni 生成 JNI 样式的标头文件 (默认值)
-force 始终写入输出文件
-classpath <path> 从中加载类的路径
-cp <path> 从中加载类的路径
-bootclasspath <path> 从中加载引导类的路径
2.简单使用(使用-v参数启用详细输出,-jni后面的 路径是包名+类名)
操作后会产生一个Work1.h文件
八:javap:
java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
1.用法: 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> 覆盖引导类文件的位置
2.简单使用
直接javap 类文件,将.clss文件反编译为源代码(经过优化后的代码)
使用-c命令,将.class文件反汇编(不等于反编译)为汇编语言
九:jar:
多用途的存档及压缩工具,是个java应用程序,可将多个文件合并为单个JAR归档文件。
1.用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项:
-c 创建新档案
-t 列出档案目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有档案
-v 在标准输出中生成详细输出
-f 指定档案文件名
-m 包含指定清单文件中的清单信息
-n 创建新档案后执行 Pack200 规范化
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储; 不使用任何 ZIP 压缩
-P 保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含以下文件
如果任何文件为目录, 则对其进行递归处理。
清单文件名, 档案文件名和入口点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。
2.简单使用
将两个类文件(Work1.class, fanxing.class)归档到一个名为 classes.jar 的档案中:
会在当前目录下产生一个名为classes.jar的文件
十:jcmd
一个多功能的工具,可以用它来导出堆、查看Java进程、导出线程信息、执行GC、还可以进行采样分析(jmc 工具的飞行记录器)。
十一:jconsole
一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打 jconsole,选想要监视的 进程就可以了。
十二:其它关于jvm性能调优的工具: jdeps,jhat,jinfo,jmap,jstack,jps
jstatd:jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。jstatd是基于RMI的,所以在运行jstatd的服务器上必须存在RMI注册中心,如果没有通过选项”-p port”指定要连接的端口,jstatd会尝试连接RMI注册中心的默认端口。
jhat:用于对JAVA heap进行离线分析的工具,他可以对不同虚拟机中导出的heap信息文件进行分析,如Linux上导出的文件可以拿到WINDOWS上进行分析,可以查找诸如内存方面的问题。
jinfo:jinfo 可以输出并修改运行时的java 进程的opts。
jmap:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。
jstat:Jstat 用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:
- 类的加载及卸载情况
- 查看新生代、老生代及持久代的容量及使用情况
- 查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
- 查看新生代中Eden区及Survior区中容量及分配情况等
jstack :jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项”-J-d64”。
jps:用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。使用jps时,如果没有指定hostid,它只会显示本地环境中所有的Java进程;如果指定了hostid,它就会显示指定hostid上面的java进程,不过这需要远程服务上开启了jstatd服务。