java的bin⽬录_JDK的bin⽬录下那些常见⼯具使⽤集锦
在JDK的bin⽬录下有许多java⼩⼯具可以⽤于编译,运⾏以及调试Java程序或监控的运⾏。在习惯于在Window下使⽤Eclipse等IDE⼯具开发的程序员来说,可能bin⽬录下的很多⼯具都很少使⽤。但是如果是运⾏在Linux下的应⽤程序并且是命令⾏模式运⾏的话,很多时候使⽤JDK提供的⼀些⼯具可以给开发⼈员带来很多便利。本⽂总结了在实际开发中我们可能接触到或需要掌握的⼀些⼩⼯具的基本⽤法。对于像java,javac,javadoc这样的⼯具可能更多的时候不需要我们掌握,因此本⽂也只是提供基本⽤法。但是对于像jps,jdb等这样⼀些debug 或监控⼯具,对于在linux下的命令⾏模式下调试以及监控Java应⽤程序很有⽤,因此重点介绍。
注意:所有的这些⼯具的使⽤的前提是已经配置和Path环境变量
1. javac
很多第⼀次接触java的开发者写得第⼀个helloworld程序使⽤的第⼀个编译器估计就是
javac [ options ] [ sourcefiles ] [ classes ] [ @argfiles ]
最简单的⽤法是:
javac 'your sourcefile name' 'your class filename'
⽐如我编译HelloWorld.java这个⽂件
javac HelloWorld.java
这样就会在这个源⽂件⽬录下⽣成⼀个HelloWorld.class⽂件,我们也可以⼀次编译多个,语法是:jdk怎么使用
javac source1.java source2.java source3.java
实际开发中,⽂件数量,包数量已经⽂件关系⽐这个复杂得多。⽽且我们希望⽣成的class⽂件和源⽂件是分开的。这就需要使⽤到这个⼯具的选项了。
想要javac有哪些选项可以⽤,最简单的⽅式就是输⼊:
javac -help
(
)
事实上,作为⼀般开发者,根本不需要使⽤javac,他们只要将写好的源码提交到svn,会有构建⼯具⾃动打包编译测试发布的
实际开发中,假如要⽤到这个⼯具,记的javac -help
2. java
java⼯具⽤于启动⼀个java应⽤程序,这个java应⽤程序必须要与⼊⼝函数main⽅法。这个⼯具的语法是
java [ options ] -jar file.jar [ arguments ]
我们也可以通过java -help来查看这个⼯具的选项和⽤法。
实际开发中,⼀般会写⼀个.sh脚本调⽤这个⼯具来启动应⽤程序,⽆需开发者⼿动来启动。关于如何写.sh启动脚本,后⾯有时间新开⼀篇博⽂讲解。
3. jar
jar这个⼯具⽤于打包、更新、解包java应⽤程序。实际开发中,我们都会将应⽤程序打包成⼀个jar包来运⾏,jar会将全部class⽂件以及资源⽂件,配置⽂件放到⼀个⽂件⾥打个包(有的说是压缩,事实上这个⼯具仅仅是打包,并不包含压缩操作)。创建⼀个jar⽂件常⽤语法如下:
jar c[v0M]f jarfile [-C dir] inputfiles [-Joption]
jar c[v0]mf manifest jarfile [-C dir] inputfiles [-Joption] [-e entrypoint]
jar c[v0M] [-C dir] inputfiles [-Joption]
jar c[v0]m manifest [-C dir] inputfiles [-Joption]
这⾥的c就是创建的意思,jarfile是要打包的jar⽂件名,-C临时改变输⼊⽂件源,-J指定运⾏参数,⽐如指定初始堆栈和最⼤堆栈⼤⼩等。参数和-J之间不能含有空格。实际开发中,这⼀步骤也是写在脚本中,⼀般不需要⼿动调⽤。
4. javadoc
javadoc是JDK提供给程序员的⼀个⽂档⽣成⼯具。这个⼯具我觉得是java⽐C/C++在⽂档化⽅⾯先进的地⽅。只要按照正确的格式在代码中写上对应的注释,程序写完后,使⽤这个⼯具就可以⾃动⽣成HTML样式的⽂档。⽐如JDK API的⽂档就是使⽤这个⼯具⽣成的。要⽣成类似⽂档的注释语法可以参考链接中的⽂档或直接看看JDK中的注释。这个⼯具的基本语法是:
javadoc [ options ] [ packagenames ] [ sourcefilenames ] [ -subpackages pkg1:pkg2:... ] [ @argfiles ]
这个⼯具只会将"*.java"中的注释⽂档化,我们需要指定包名和源⽂件名,如果有⼦包也需要特别指出。需要注意的是这个⼯具不⽀持通配符。详细的语法以及⽤法可以参考这个⽂档。
5.javap
javap是⼀个反编译⼯具,也可以查看class⽂件中的信息。基本语法如下:
javap [ options ] classes
如果不带任何参数,则只会将class⽂件中的包信息,protected和public字段以及⽅法打印出来。⽐如我们有⼀个这样的HelloWord.java ⽂件:
public class HelloWorld {undefined
public String pubStr = "public string";
private String priStr = "private string";
protected String proStr = "protected string";
public static void main(String[] args) {undefined
sayHello("JackWang");
}
private static void sayHello(String name) {undefined
System.out.println("Hello," + name);
}
public void pubMethod() {undefined
System.out.println("hello");
}
}
在⽣成的class⽂件⽬录下使⽤
javap HelloWorld.class
⽣成的信息如下:
如果要查看编译后的指令,可以加⼀个 -c 选项:
javap -c HelloWorld.class
⽣成的信息如下:
⼀次也可以反编译多个class⽂件,只要将class⽂件名加在后⾯即可。如果只要打印这个类的public字段和⽅法,可以这样: javap -public HelloWorld.class
同样如果是 -private或-p 则会打印包括 private在内的所有可见字段或⽅法,也就是全部,如果是 -protected,则打印protected和public 的,如果是 -package则打印⽆可见符修饰以及protected,public的。
如果要打印这个类的MD5,最后修改时间等元数据,则可以加⼀个 -sysinfo参数:
javap -sysinfo HelloWorld.class
⽣成的信息如下:
其他参数可以参考javap⽂档或输⼊javap参考帮助信息。
6.jdb
jdb是⼀个断点⼯具,类似于gdb。基本语法如下:
jdb [ options ] [ class ] [ arguments ]
IDE的断点可以本地调试⽣产环境代码,但是却不能在线调试,这时候就可以使⽤jdb了。总的来说,jdb的使⽤⽐gdb复杂⼀些。如果⽤过gdb,则⼊⼿jdb相对会简单⼀些。
⾸先,我们的应⽤程序启动脚本要配置了如下的启动参数:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y"
然后启动程序,在程序运⾏所在机器上输⼊⼀下命令:
jdb -attach 127.0.0.1:8787
如果前⾯配置了启动参数,则会进⼊jdb模式:
这⾥我使⽤了Tomcat 7.0.67这个版本作为测试,在Bootstrap这个启动类的396⾏打了⼀个断点
stop at org.apache.catalina.startup.Bootstrap:396
如果我们要在某个⽅法执⾏前打⼀个断点,则可以使⽤
stop at org.apache.catalina.startup.Bootstrap.main
这样就在main⽅法上打了⼀个断点。如果某个⽅法被重载,则还要指定相应的参数。对应的清楚断点是
clear org.apache.catalina.startup.Bootstrap:396
然后输⼊run 让程序跑起来,则⾃动会在396⾏断住。
输⼊next则执⾏到下⼀⾏,相当于中的F6,输⼊step则跳进⽅法,相当于Eclipse中的F5
使⽤print或dump可以将⼀个变量或对象的值打印出来
输⼊threads可以查看当前这个JVM运⾏的全部线程
其他详细命令可以参考⽂档
7.jps
jps⽤于查看运⾏的JVM实例以及进程号。我们常常使⽤jps⼯具开查看某⼀进程的进程号然后使⽤其他⼯具来监控这⼀进程的运⾏信息。基本语法如下:
jps [ options ] [ hostid ]
如果是查看本机运⾏的JVM实例,直接输⼊jps
如果要查看运⾏的JVM的main⽅法传⼊的参数可以输⼊jps -m
如果要查看运⾏的JVM的各个参数,可以输⼊jps -v
如果要只要查看运⾏的进程ID,可以输⼊jps -q
如果要查看运⾏的JVM的全限定名,可以输⼊jps -l
8.jstat
jstat⽤于查看运⾏的JVM实例的运⾏数据。基本语法如下:
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
其中,vmid需要通过jps来获取。可以通过输⼊各个选项来查看相应查看的运⾏数据。
⽐如我想查看29869这个进程的类加载信息,每1秒查看⼀次,总共查看3次,可以输⼊
jstat -class 29869 1000 3
得到的数据如下:
Loaded⼀列表⽰已经加载完成的类,总共加载了16183.3KB的数据,Unloaded⼀列表⽰已经卸载的类,总共卸载了110.0KB的数据,加载和卸载耗时17.16个时间单位(秒还是毫秒我也不确定)。
这⾥如果我不指定打印3次,则每秒钟都会打印⼀次,⼀直打印下去。如果不指定频率,则只会打印查询那⼀刻的数据。
如果想查看编译信息,则输⼊
jstat -compiler 29869
Compiled表⽰编译成功的类数⽬,其他各列可以根据名字猜测出来,也可以查看 jstat⽂档
如果输⼊
jstat -gc 29869 1000 3
则表⽰查看29869这个进程的堆内存回收情况,每秒查看⼀次,总共查看3次。得到的信息如下:
这⾥S0C⼀列表⽰新⽣代幸存0区已经占⽤了75264KB内存,
S1C⼀列表⽰幸存1区已经占⽤74240KB内存,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论