白癜风治疗需要多少钱 https://disease.39.net/bjzkbdfyy/170805/5599614.html作为Java开发人员,我们肯定知道JDK的bin目录下有"java.exe"、"javac.exe"这两个命令工具,这也是我们平时用得最多的工具。但其实bin目录下还有很多工具,这些工具可以帮助我们进行JVM的调优,帮我们定位找出应用程序运行中产生的问题。下面我们来看看其中一些调优工具。
前置启动程序
先启动一个web应用程序,然后用各种JDK自带命令优化应用。
jps
jps
用jps查看应用进行ID
jinfo
jinfo-flags
此命令可以实时查看和调整虚拟机各项参数。
jmap
此命令可以用来查看内存信息,实例个数以及占用大小,还可以生成堆转储快照。
jmap-histo#查看历史生成的实例jmap-histo
ve#查看当前存活的实例,执行过程中可能会触发一次fullgc
打开log.txt,内容如下:
num:序号
instances:实例数量
bytes:占用空间大小
classname:类名称,[Cisachar[],[Sisashort[],[Iisaint[],[Bisabyte[],[[Iisaint[][]
堆信息
可以查看当前应用的堆具体配置、使用信息。
jmap-heap
转储堆内存dump
jmap-dump
ormat=b,file=web.hprof
也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
-XX
HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./(路径)
示例代码:
publicclassOOMTest{publicstaticListObjectlist=newArrayList();//JVM设置//-Xms10M-Xmx10M-XX
PrintGCDetails-XX
HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=D:\jvm.dumppublicstaticvoidmain(String[]args){ListObjectlist=newArrayList();inti=0;intj=0;while(true){list.add(newUser(i++,UUID.randomUUID().toString()));}}}
jvisualvm
jvisualvm
该命令可以打开一个可视化界面,监视当前运行应用程序、dump文件进行故障分析等功能。
导入上面示例代码运行后产生的hprof文件,可以看到User对象实例数名列前茅。
jstack
此命令可以用来跟踪Java堆栈信息。用于生成虚拟机当前试课的线程快照。快照可以定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
死锁示例
publicclassDeadLockTest{privatestaticObjectlock1=newObject();privatestaticObjectlock2=newObject();publicstaticvoidmain(String[]args){newThread(()-{synchronized(lock1){try{System.out.println("thread1begin");Thread.sleep();}catch(InterruptedExceptione){}synchronized(lock2){System.out.println("thread1end");}}}).start();newThread(()-{synchronized(lock2){try{System.out.println("thread2begin");Thread.sleep();}catch(InterruptedExceptione){}synchronized(lock1){System.out.println("thread2end");}}}).start();System.out.println("mainthreadend");}}
jstack
"Thread-1":线程名
prio=5:java线程优先级
os_prio:操作系统线程优先级
nid=0x线程对应的本地线程标识nid
java.lang.Thread.State:BLOCKED线程状态
还可以用jvisualvm自动检测到死锁。
找出占用cpu最高的线程堆栈信息
publicclassMath{publicstaticfinalintinitData=;publicstaticUseruser=newUser();publicint