- jps
- 常用选项
- javac
- 标准选项
- 联编选项
- 非标准选项
- jar
- java
- javadoc
- 常用选项
- javah
- 常用选项
- javap
- 常用选项
- jconsole
- jstat
- jstack
- jmap
- javaw
- 其它
jps(Java Virtual Machine Process Status Tool) 是 JDK 1.5 提供的一个显示当前所有 java 进程 pid 的命令,简单实用,非常适合在 linux/unix 平台上简单察看当前 java 进程的一些简单情况。
我想很多人都是用过 unix 系统里的 ps 命令,这个命令主要是用来显示当前系统的进程情况(有哪些进程,及其 id)。 jps 也是一样,它的作用是显示当前系统的 java 进程情况。我们可以通过它来查看我们到底启动了几个 java进程和他们的进程号(每一个java程序都会独占一个java虚拟机实例),并可通过 opt
来查看这些进程的详细启动参数。
jps 存放在JAVA_HOME/bin/jps
,使用时为了方便请将JAVA_HOME/bin/
加入到环境变量Path
中。
示例1,查看java进程:
[root@linux ~]# jps
23991 Jps
23789 BossMain
23651 Resin
注:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。
示例2,列出远程服务器192.168.0.77机器所有的jvm实例(采用rmi协议,默认连接端口为1099):
jps 192.168.0.77
注:sudo jps看到的进程数量最全
参考文章: Linux常用命令大全
javacjavac 命令用于编译 java 源码文件
语法格式:
javac [ options ] [ sourcefiles ] [ @files ]
参数可按任意次序排列。
options
命令行选项sourcefiles
一个或多个要编译的源文件@files
一个或多个对源文件进行列表的文件
有两种方法可将源代码文件名传递给 javac:
-
如果源文件数量少,在命令行上列出文件名即可
-
如果源文件数量多,则将源文件名列在一个文件中,名称间用空格或换行符来进行分隔。然后在 javac 命令行中使用该列表文件名,文件名前冠以 @ 字符
查找类型
当编译源文件时,编译器常常需要它还没有识别出的类型的有关信息。对于源文件中使用、扩展或实现的每个类或接口,编译器都需要其类型信息。这包括在源文件中没有明确提及、但通过继承提供信息的类和接口。
例如,当扩展 java.applet.Applet
时还要用到 Applet
的祖先类:java.awt.Panel
、 java.awt.Container
、java.awt.Component
和 java.awt.Object
。
当编译器需要类型信息时,它将查找定义类型的源文件或类文件。编译器先在自举类及扩展类中查找,然后在用户类路径中查找。用户类路径通过两种途径来定义:通过设置 CLASSPATH
环境变量或使用 -classpath
命令行选项。(有关详细资料,请参阅设置类路径)。如果使用 -sourcepath
选项,则编译器在 sourcepath
指定的路径中查找源文件;否则,编译器将在用户类路径中查找类文件和源文件。可用 -bootclasspath
和 -extdirs
选项来指定不同的自举类或扩展类;参阅下面的联编选项。
javac 对各种搜索结果的处理:
搜索结果只类文件而没有源文件: javac 使用类文件。
搜索结果只有源文件而没有类文件: javac 编译源文件并使用由此生成的类文件。
搜索结果既有源文件又有类文件: 确定类文件是否过时。若类文件已过时,则 javac 重新编译源文件并使用更新后的类文件。否则, javac 直接使用类文件。
缺省情况下,只要类文件比源文件旧, javac 就认为它已过时。
注意: javac 可以隐式编译一些没有在命令行中提及的源文件。用 -verbose 选项可跟踪自动编译。
文件列表
为缩短或简化 javac 命令,可以指定一个或多个每行含有一个文件名的文件。在命令行中,采用 ‘@’ 字符加上文件名的方法将它指定为文件列表。当 javac 遇到以 `@’ 字符开头的参数时,它对那个文件中所含文件名的操作跟对命令行中文件名的操作是一样的。
例如,可以在名为 sourcefiles 的文件中列出所有源文件的名称。该文件可能形如:
MyClass1.java
MyClass2.java
MyClass3.java
执行sourcefiles文件的命令语句如下:
[root@linux ~]# javac @sourcefiles
标准选项
选项说明-classpath
或者-cp
类路径,设置用户类路径,它将覆盖CLASSPATH
环境变量中的用户类路径。若未指定 -sourcepath
选项,则在用户类路径中查找类文件和源文件。若既未设置CLASSPATH 又未指定 -classpath 选项,则用户类路径由当前目录构成-d
目录,设置类文件的目标目录。如果某个类是一个包的组成部分,则 javac 将把该类文件放入反映包名的子目录中,必要时创建目录。例如,如果指定 -d c:\myclasses
并且该类名叫 com.mypackage.MyClass
,那么类文件就叫作 c:\myclasses\com\mypackage\MyClass.class
。若未指定 -d
选项,则 javac
将把类文件放到与源文件相同的目录中。注意: -d
选项指定的目录不会被自动添加到用户类路径中-deprecation
显示每种不鼓励使用的成员或类的使用或覆盖的说明。没有给出 -deprecation 选项的话, javac 将显示这类源文件的名称:这些源文件使用或覆盖不鼓励使用的成员或类-encoding
设置源文件编码名称,例如 EUCJIS/SJIS。若未指定 -encoding
选项,则使用平台缺省的转换器-g
生成所有的调试信息,包括局部变量。缺省情况下,只生成行号和源文件信息-g:none
不生成任何调试信息-g:{关键字列表}
只生成某些类型的调试信息,这些类型由逗号分隔的关键字列表所指定。有效的关键字有:source
源文件调试信息lines
行号调试信息vars
局部变量调试信息-nowarn
禁用警告信息-O
优化代码以缩短执行时间。使用 -O 选项可能使编译速度下降、生成更大的类文件并使程序难以调试。在 JDK 1.2 以前的版本中,javac 的 -g 选项和 -O 选项不能一起使用。在 JDK 1.2 中,可以将 -g 和 -O 选项结合起来,但可能会得到意想不到的结果,如丢失变量或重新定位代码或丢失代码。-O 选项不再自动打开 -depend 或关闭 -g 选项。同样, -O 选项也不再允许进行跨类内嵌-sourcepath
源路径,指定用以查找类或接口定义的源代码路径。与用户类路径一样,源路径项用分号 (😉 进行分隔,它们可以是目录、jar 归档文件或 zip 归档文件。如果使用包,那么目录或归档文件中的本地路径名必须反映包名。注意:通过类路径查找的类,如果找到了其源文件,则可能会自动被重新编译-verbose
冗长输出。它包括了每个所加载的类和每个所编译的源文件的有关信息
联编选项
缺省情况下,类是根据与 javac 一起发行的 JDK 自举类和扩展类来编译。但 javac 也支持联编,在联编中,类是根据其它 Java平台实现的自举类和扩展类来进行编译的。联编时, -bootclasspath 和 -extdirs 的使用很重要;请参阅下面的联编程序示例。
选项说明-target
版本,生成将在指定版本的虚拟机上运行的类文件。缺省情况下生成与 1.1
和 1.2
版本的虚拟机都兼容的类文件。JDK 1.2 中的 javac 所支持的版本有:1.1
保证所产生的类文件与 1.1
和 1.2
版的虚拟机兼容。这是缺省状态。1.2
生成的类文件可在 1.2
版的虚拟机上运行,但不能在 1.1
版的虚拟机上运行。-bootclasspath
自举类路径,根据指定的自举类集进行联编。和用户类路径一样,自举类路径项用分号 (😉 进行分隔,它们可以是目录、jar 归档文件或 zip 归档文件。-extdirs
目录,根据指定的扩展目录进行联编。目录是以分号分隔的目录列表。在指定目录的每个 jar 归档文件中查找类文件。
非标准选项
选项说明-X
显示非标准选项的有关信息并退出。-Xdepend
递归地搜索所有可获得的类,以寻找要重编译的最新源文件。该选项将更可靠地查找需要编译的类,但会使编译进程的速度大为减慢。-Xstdout
将编译器信息送到System.out 中。缺省情况下,编译器信息送到 System.err 中。-Xverbosepath
说明如何搜索路径和标准扩展以查找源文件和类文件。-J选项
将选项传给 javac 调用的 java 启动器。例如, -J-Xms48m
将启动内存设为 48 兆字节。虽然它不以 -X 开头,但它并不是 javac 的‘标准选项’。用 -J
将选项传给执行用 Java 编写的应用程序的虚拟机是一种公共约定。注意: CLASSPATH 、 -classpath 、 -bootclasspath 和 -extdirs 并不指定用于运行 javac 的类。如此滥用编译器的实现通常没有任何意义而且总是很危险的。如果确实需要这样做,可用 -J 选项将选项传给基本的 java 启动器。
[root@linux ~]# javac -cp Servlet-api.jar -d . HelloServlet.java
说明: HelloServlet.java编译后的.class文件存放在当前目录下,且编译中需要的类文件,编译器可以在 Servlet-api.jar 中查找,该jar文件存放在HelloServlet.java 所在目录下。 -d
后跟路径,.class文件存放在-d后面缩写的路径下
查看详情,猛戳《JDK 命令之 jar – 打包/解包工具》
java查看详情,猛戳《JDK 命令之 java – 用来执行字节码文件》
javadoc主要用于生成帮助文档
用法: javadoc [options] [packagenames] [sourcefiles] [@files]
常用选项 选项说明-overview从 HTML 文件读取概览文档-public仅显示 public 类和成员-protected显示 protected/public 类和成员 (默认值)-package显示 package/protected/public 类和成员-private显示所有类和成员-help显示命令行选项并退出-doclet通过替代 doclet 生成输出-docletpath指定查找 doclet 类文件的位置-sourcepath指定查找源文件的位置-classpath指定查找用户类文件的位置-exclude指定要排除的程序包列表-subpackages指定要递归加载的子程序包-breakiterator计算带有 BreakIterator 的第一个语句-bootclasspath覆盖由引导类加载器所加载的类文件的位置-source提供与指定发行版的源兼容性-extdirs覆盖所安装扩展的位置-verbose输出有关 Javadoc 正在执行的操作的信息-locale要使用的区域设置, 例如 en_US 或 en_US_WIN-encoding源文件编码名称-quiet不显示状态消息-J直接将 传递到运行时系统-X输出非标准选项的提要通过标准 doclet 提供:
选项说明-d输出文件的目标目录-use创建类和程序包用法页面-version包含 @version 段-author包含 @author 段-docfilessubdirs递归复制文档文件子目录-splitindex将索引分为每个字母对应一个文件-windowtitle文档的浏览器窗口标题-doctitle包含概览页面的标题-header包含每个页面的页眉文本-footer包含每个页面的页脚文本-top包含每个页面的顶部文本-bottom包含每个页面的底部文本-link创建指向位于 的 javadoc 输出的链接-linkoffline利用位于 的程序包列表链接至位于 的文档-excludedocfilessubdir :…排除具有给定名称的所有文档文件子目录。-group :…在概览页面中, 将指定的程序包分组-nocomment不生成说明和标记, 只生成声明。-nodeprecated不包含 @deprecated 信息-noqualifier ::…输出中不包括限定符的列表。-nosince不包含 @since 信息-notimestamp不包含隐藏时间戳-nodeprecatedlist不生成已过时的列表-notree不生成类分层结构-noindex不生成索引-nohelp不生成帮助链接-nonavbar不生成导航栏-serialwarn生成有关 @serial 标记的警告-tag ::指定单个参数定制标记-taglet要注册的 Taglet 的全限定名称-tagletpathTaglet 的路径-Xdocrootparent将文档注释中出现的所有后跟 /… 的 @docRoot 替换为-charset用于跨平台查看生成的文档的字符集。-helpfile包含帮助链接所链接到的文件-linksource以 HTML 格式生成源文件-sourcetab指定源中每个制表符占据的空格数-keywords使程序包, 类和成员信息附带 HTML 元标记-stylesheetfile用于更改生成文档的样式的文件-docencoding输出编码名称 javah主要是用于生成头文件。
用法:javah [options]
常用选项 选项说明-o输出文件 (只能使用 -d 或 -o 之一)-d输出目录-v 或 -verbose启用详细输出-h 或 --help 或 -?输出此消息-version输出版本信息-jni生成 JNI 样式的标头文件 (默认值)-force始终写入输出文件-classpath 从中加载类的路径-bootclasspath 从中加载引导类的路径是使用其全限定名称指定的 javap反编译器,显示编译类中可以访问的方法和数据
语法格式: javap
常用选项 选项说明-help 或 --help或 -?Print this usage message-versionVersion information-v或 -verbosePrint additional information-lPrint line number and local variable tables-publicShow only public classes and members-protectedShow protected/public classes and members-packageShow package/protected/public classes and members (default)-p 或 -privateShow all classes and members-cDisassemble the code-sPrint internal type signatures-sysinfoShow system info (path, size, date, MD5 hash) of class being processed-constantsShow static final constants-classpath Specify where to find user class files-bootclasspath Override location of bootstrap class files jconsole图形化查看线程的内存信息
[root@linux ~]# jconsole # 执行命令打开图形化界面
jstat
监控进程的 GC 情况
GC:垃圾回收 YGC:young garbage collector 年轻代垃圾回收 FGC:full garbage collector 整个堆的垃圾回收 堆内存结构:分为年轻代(young)、老年代(old),年轻代分为 eden、survive1、survive2,不同区采用不同的 GC 算法
对某进程,每秒监控一次 GC 情况:
[root@linux ~]# jstat -gcutil 1164 1000; # 1164 是进程号,监控时间是1000 毫秒
查看某进程,young 区的 GC 情况:
[root@linux ~]# jstat -gcnew 1164; # 查看进程 1164 的 young 区的 GC 情况
jstack
用来分析线程
查看某进程的线程详细信息:
[root@linux ~]# jstack 1164; # 查看进程 1164 的线程详细信息
jmap
jmap 查看进程的内存信息或者 dump 进程的内存信息
注:dump 转储、倾倒等意思
示例 1,把 java 进程的内存状态信息 dump(转储) 到指定的文件中:
[root@linux ~]# jmap -dump:file=filename 1164; # 把进程 1164 的内存状态信息 dump 到文件 filename 中,filename 需要专门的工具查看,例如:VisualVM
[root@linux ~]# jmap -dump:live,format=b,file=myjmapfile.txt 19570; # live 表示只输出活的对象,format=b 表示以字节格式输出
[root@linux ~]# jmap -dump:format=b,file=outfile 3024;
示例 2,打印进程 19570 正等候回收的对象的信息:
[root@linux ~]# jmap -finalizerinfo 19570;
注:VisualVM 是一个可以查看 java 进程内存状态信息的MAT MAT: 内存分析工具
示例 3,直接打印出某进程的堆信息:
[root@linux ~]# jmap -heap 1164;
[root@linux ~]# jmap -J-d64 -heap pid # 64 位机上使用需要输入此选项 -J-d64
[root@htlwk0001host ~]# jmap -heap 806764;
Attaching to process ID 806764, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 954204160 (910.0MB)
NewSize = 19922944 (19.0MB)
MaxNewSize = 317718528 (303.0MB)
OldSize = 40894464 (39.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 = 250609664 (239.0MB)
used = 33503128 (31.951072692871094MB)
free = 217106536 (207.0489273071289MB)
13.36864966228916% used
From Space:
capacity = 31981568 (30.5MB)
used = 22862880 (21.803741455078125MB)
free = 9118688 (8.696258544921875MB)
71.4876769018955% used
To Space:
capacity = 33554432 (32.0MB)
used = 0 (0.0MB)
free = 33554432 (32.0MB)
0.0% used
PS Old Generation
capacity = 92274688 (88.0MB)
used = 30681656 (29.26030731201172MB)
free = 61593032 (58.73969268798828MB)
33.25034921819513% used
24680 interned Strings occupying 2243592 bytes.
[root@htlwk0001host ~]#
解析:
using parallel threads in the new generation. ##新生代采用的是并行线程处理方式
using thread-local object allocation.
Concurrent Mark-Sweep GC ##同步并行垃圾回收
Heap Configuration: ##堆配置情况,也就是JVM参数配置的结果[平常说的tomcat配置JVM参数,就是在配置这些]
MinHeapFreeRatio = 40 ##最小堆使用比例
MaxHeapFreeRatio = 70 ##最大堆可用比例
MaxHeapSize = 2147483648 (2048.0MB) ##最大堆空间大小
NewSize = 268435456 (256.0MB) ##新生代分配大小
MaxNewSize = 268435456 (256.0MB) ##最大可新生代分配大小
OldSize = 5439488 (5.1875MB) ##老年代大小
NewRatio = 2 ##新生代比例
SurvivorRatio = 8 ##新生代与suvivor的比例
PermSize = 134217728 (128.0MB) ##perm区 永久代大小
MaxPermSize = 134217728 (128.0MB) ##最大可分配perm区 也就是永久代大小
Heap Usage: ##堆使用情况【堆内存实际的使用情况】
New Generation (Eden + 1 Survivor Space): ##新生代(伊甸区Eden区 + 幸存区survior(1+2)空间)
capacity = 241631232 (230.4375MB) ##伊甸区容量
used = 77776272 (74.17323303222656MB) ##已经使用大小
free = 163854960 (156.26426696777344MB) ##剩余容量
32.188004570534986% used ##使用比例
Eden Space: ##伊甸区
capacity = 214827008 (204.875MB) ##伊甸区容量
used = 74442288 (70.99369812011719MB) ##伊甸区使用
free = 140384720 (133.8813018798828MB) ##伊甸区当前剩余容量
34.65220164496263% used ##伊甸区使用情况
From Space: ##survior1区
capacity = 26804224 (25.5625MB) ##survior1区容量
used = 3333984 (3.179534912109375MB) ##surviror1区已使用情况
free = 23470240 (22.382965087890625MB) ##surviror1区剩余容量
12.43827838477995% used ##survior1区使用比例
To Space: ##survior2 区
capacity = 26804224 (25.5625MB) ##survior2区容量
used = 0 (0.0MB) ##survior2区已使用情况
free = 26804224 (25.5625MB) ##survior2区剩余容量
0.0% used ## survior2区使用比例
PS Old Generation: ##老年代使用情况
capacity = 1879048192 (1792.0MB) ##老年代容量
used = 30847928 (29.41887664794922MB) ##老年代已使用容量
free = 1848200264 (1762.5811233520508MB) ##老年代剩余容量
1.6416783843721663% used ##老年代使用比例
Perm Generation: ##永久代使用情况
capacity = 134217728 (128.0MB) ##perm区容量
used = 47303016 (45.111671447753906MB) ##perm区已使用容量
free = 86914712 (82.8883285522461MB) ##perm区剩余容量
35.24349331855774% used ##perm区使用比例
示例 4,-histo[:live]
打印每个 class 的实例数目,内存占用,类全名信息,VM的内部类名字开头会加上前缀”*”,如果 live 子参数加上后,只统计活的对象数量。
[root@htlwk0001host ~]# jmap -histo:live 806764;
num #instances(实例数) #bytes(字节数) class name
--------------------------------------------------------------
1: 80519 8144592 [C
2: 80345 1928280 java.lang.String
3: 17230 1516240 java.lang.reflect.Method
4: 35301 1129632 java.util.concurrent.ConcurrentHashMap$Node
5: 9176 1016440 java.lang.Class
6: 20765 830600 java.util.LinkedHashMap$Entry
[root@htlwk0001host ~]# jmap -histo pid>a.log # 输出到日志文件中,使用文本对比工具,可以对比出GC回收了哪些对象
示例 5,-permstat
打印 classload 和 jvm heap 永久层的信息,包含每个 classloader 的名字,活泼性,地址,父 classloader 和加载的 class 数量,另外内部 String 的数量和占用内存数也会打印出来
[root@htlwk0001host ~]# jmap -permstat 19570;
javaw
其它
监控java线程数:
[root@htlwk0001host ~]# ps -eLf | grep java | wc -l
监控网络客户连接数:
[root@htlwk0001host ~]# netstat -n | grep tcp | grep 侦听端口 | wc -l
上面两个命令,可改动grep的参数,来达到更细致的监控要求。