我们写的java程序需要在jvm上运行,可能出现内存泄漏,死循环,内存溢出,死循环,死锁,当发生这些事情的时候,我们就需要借助jdk的工具。
jdk的bin目录下有很多工具
例如
javac.exe 编辑java文件的
java.exe 来执行.class文件的
javap.exe 是反编译.class文件的
jar.exe是用来打jar包的
将jdk的lib下的tools.jar 解压,然后在sun/tools下可以看到与bin目录下的工具名称一样的目录,这里面放的就是上面工具的源码,编译之后就可以运行了
我们jdk8学习这些命令
jps的作用
常见的命令参数有:
jps -v
jstat 命令
jstat -gc
如果不指定 间隔和次数,默认只会打印一次
jstat -class
jstat -compiler
gc命令的详细分析
jstat -gc
01064341885 酒仙桥电话
S0C S1C 表示的是:堆内存中幸存区域的大小
S0U S1U 表示的是:堆内存中幸存区的使用大小
EC 表示的是:伊甸园区的内存大小
EU 表示的是:伊甸园区的使用内存
OC 表示的是:老年代的容量
OU 表示的是:老年代的使用状态
(其中MC和MU 在jdk1.8中使用,即对于方法区的方案用的是:元空间,在jdk1.7中叫做永久代的大小)
MC 表示的是:元空间的大小
MU 表示的是:元空间的使用大小
CCSC 表示的是:类压缩空间的容量
CCSU 表示的是:类压缩空间使用的大小
YGC 表示的是: young gc的次数
YGCT 表示的是: young gc 用的时间
FGC:表示的是:Full gc 的次数
FGCT: 表示的是:Full gc 用的时间
GCT 表示的是: 所有gc用的时间
main方法中执行到数组第三次垃圾回收
jmp命令:
jmap -heap pid
分析:
jhat命令
点开:
jstack命令:
jstack -F pid
jstack -l
写一个死循环代码,我们借助process explorer来查看cpu的使用情况
我们看到对应的Threads中6160(对应的十六进制是:1810) 的占用cpu占用的比较高:
我们根据进程id即java.exe 的进程id,利用 jstack -l 命令来查看该进程的所有线程信息,我们找到线程id是1810
下面是获取外部资源(例如需要输入,即卡顿长时间没有响应)利用jstack来进行分析
利用jstack来演示死锁:
可视化工具jconsole:
在terminal 中直接输入jconsole 就可以看到图形化界面了
虚拟机的配置信息