竹笋

注册

 

发新话题 回复该主题

JVM调优工具使用手册 [复制链接]

1#
白癜风治疗需要多少钱 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-histove#查看当前存活的实例,执行过程中可能会触发一次fullgc

打开log.txt,内容如下:

num:序号

instances:实例数量

bytes:占用空间大小

classname:类名称,[Cisachar[],[Sisashort[],[Iisaint[],[Bisabyte[],[[Iisaint[][]

堆信息

可以查看当前应用的堆具体配置、使用信息。

jmap-heap

转储堆内存dump

jmap-dumpormat=b,file=web.hprof

也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)

-XXHeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=./(路径)

示例代码:

publicclassOOMTest{publicstaticListObjectlist=newArrayList();//JVM设置//-Xms10M-Xmx10M-XXPrintGCDetails-XXHeapDumpOnOutOfMemoryError-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

分享 转发
TOP
发新话题 回复该主题