本文参考http://www.hollischuang.com/?s=java%E5%91%BD%E4%BB%A4%E5%AD%A6%E4%B9%A0
作为一个java开发人员,应该了解java常用指令,这些指令都是位于JAVE_HOME目录的bin下面,简单介绍下:
1.javac
这个应该比较熟悉,用来编译java源文件的
一般执行java文件,如Test.java,先执行javac Test.java, 然后执行java Test即可
2.jps 查看当前用户的java的进程信息
Java程序启动后,会在java.io.tmpdir指定的临时目录下,生成一个类似于hsperfdata_User的文件夹(windows在C:\Users\Administrator\AppData\Local\Temp\hsperfdata_Administrator,Linux在/tmp/hsperfdata_root,红色为当前登录用户),这个目录下有几个java进程pid命名的文件。
public class JstackDemo { public static void main(String[] args) { Thread thread = new Thread(new Thread1()); thread.start(); } static class Thread1 implements Runnable { @Override public void run(){ while(true){ System.out.println("Hello World!"); } } } }
执行完javac JstackDemo.java和java JstackDemo后,输入jps指令显示如下图:
Jps -m 输出传给main方法的参数,这里传的test1和test2
Jps -l 输出class文件的完整package名或者jar文件完整路径名
Jps -v 输出传给JVM方法的参数
3. javap 对代码进行反编译
javap -c 输出分解后的java字节码
4. jstack 打印线程栈信息,制作线程Dump,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等
执行jstack -l 2375,线程堆栈信息如下
这里可以看到线程的状态:
线程的当前锁住的资源:locked <0x00000000e7754be8>
线程当前等待的资源:waiting on <0x00000000e7754be8>
为什么同时锁住的等待同一个资源:(详细可参考http://www.hollischuang.com/archives/110)
线程的执行中,先获得了这个对象的 Monitor(对应于 locked <0x00000000e7754be8>)。当执行到 obj.wait(), 线程即放弃了 Monitor的所有权,进入“wait set”队列(对应于 waiting on <0x00000000e7754be8> )。
-F 当jstack -l pid 没有响应的时候强制打印栈信息
-l 长列表,包含锁的附加信息
-m 打印java和native c/c++框架的所有栈信息
5. jstat 性能检测工具,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。(详细可参考http://www.hollischuang.com/archives/481)
jstat –class<pid> : 显示加载class的数量,及所占空间等信息
jstat -compiler <pid>显示VM实时编译的数量等信息
jstat -gc <pid>: 可以显示gc的信息,查看gc的次数,及时间。
6. jmap 打印内存映射,制作栈Dump(详细请参考http://www.hollischuang.com/archives/303)
jmap -heap 进程id 查看java堆使用情况
jmap -histo 进程id 查看堆内存中的对象数量及大小
jmap -dump:format=b,file=headDump <pid> 将内存使用的情况输出到文件
7. jhat 内存分析工具,生成dump文件(可用jmap生成)之后就可以用jhat命令,将dump文件转成html的形式,然后通过http访问可以查看堆情况
执行jhat -port 40000 heapDump
查看详细信息http://localhost:40000
这里是在liunx上的master节点上启动执行的,故使用master域名