java自带命令工具

王朝学院·作者佚名  2016-05-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

java自带命令工具

jstat,这个工具很强大,可以监测Java虚拟机GC多方面的状态,具体参数含义参见此链接:

./jstat-gc8401210003S0CS1CS0US1UECEUOCOUPCPUYGCYGCTFGCFGCTGCT2112.02112.00.00.017024.00.063872.01319.921248.04728.1743416209.64650.046209.6922112.02112.00.00.017024.00.063872.01319.921248.04728.1743849209.75550.046209.8012112.02112.00.00.017024.00.063872.01319.jmap,这大概是最常用的命令。下面这个命令不但可以列出类的实例数量,还有强制进行一次full GC的“副作用”,这样的副作用对于定位某些问题很有帮助,参见《使用堆外内存》:

./jmap-histo:live84012num#instances#bytesclassname----------------------------------------------1:8241177656[B2:80961106672...使用-heap参数,则可以打印堆的使用情况:

./jmap-heap84012AttachingtoPRocessID84012,pleasewait...Debuggerattachedsuccessfully.Servercompilerdetected.JVMversionis20.65-b04-462usingparallelthreadsinthenewgeneration.usingthread-localobjectallocation.ConcurrentMark-SweepGCHeapConfiguration:MinHeapFreeRatio=40MaxHeapFreeRatio=70MaxHeapSize=132120576(126.0MB)NewSize=21757952(20.75MB)MaxNewSize=174456832(166.375MB)OldSize=65404928(62.375MB)NewRatio=7SurvivorRatio=8PermSize=21757952(20.75MB)MaxPermSize=85983232(82.0MB)HeapUsage:NewGeneration(Eden+1SurvivorSpace):capacity=19595264(18.6875MB)used=16785688(16.008079528808594MB)free=2809576(2.6794204711914062MB)85.66196403375837%usedEdenSpace:capacity=17432576(16.625MB)used=16785688(16.008079528808594MB)free=646888(0.6169204711914062MB)96.28920017328477%usedFromSpace:capacity=2162688(2.0625MB)used=0(0.0MB)free=2162688(2.0625MB)0.0%usedToSpace:capacity=2162688(2.0625MB)used=0(0.0MB)free=2162688(2.0625MB)0.0%usedconcurrentmark-sweepgeneration:capacity=65404928(62.375MB)used=1390576(1.3261566162109375MB)free=64014352(61.04884338378906MB)2.126102791520541%usedPermGeneration:capacity=21757952(20.75MB)used=4852336(4.6275482177734375MB)free=16905616(16.122451782226562MB)22.301437194088855%used使用-permstat参数,查看永久区:

./jmap-permstat84012AttachingtoprocessID84012,pleasewait...Debuggerattachedsuccessfully.Servercompilerdetected.JVMversionis20.65-b04-4621239internStringsoccupying104312bytes.findingclassloaderinstances..Warning:skippinginvalidTLABforthreadt@59779Warning:skippinginvalidTLABforthreadt@59527Warning:skippinginvalidTLABforthreadt@59907Warning:skippinginvalidTLABforthreadt@60163Warning:skippinginvalidTLABforthreadt@60419Warning:skippinginvalidTLABforthreadt@60675FindingobjectsizeusingPrintezisbitsandskippingover...done.computingperloaderstat..done.pleasewait..computingliveness...done.class_loaderclassesbytesparent_loaderalive?type5903973048nulllive0x00000007f44cace000nulllivesun/misc/Launcher$ExtClassLoader@0x00000007faff8a400x00000007f44c147881439280x00000007f44cace0livesun/misc/Launcher$AppClassLoader@0x00000007fb056e88total=35984116976N/Aalive=3,dead=0N/A把内存中的堆dump成一个镜像文件:

./jmap-dump:live,format=b,file=/Users/xiongyi/Documents/dump.core84012

jstack,线程堆栈打印。注意waiting to lock <xxx>在等待锁,比如进入临界区时;locked <xxx>表示当前同步操作,线程锁住了某资源;而waiting on <xxx>指的是在同步块内,wait方法的执行中暂时地释放了该锁的占用,等唤醒的时候需要重新获取:

./jstack840122013-11-1118:30:35FullthreaddumpJavaHotSpot(TM)64-BitServerVM(20.65-b04-462mixedmode):"AttachListener"daemonprio=9tid=7ff64e206800nid=0x117782000waitingoncondition[00000000]java.lang.Thread.State:RUNNABLE"LowMemoryDetector"daemonprio=5tid=7ff64c80f000nid=0x117c96000runnable[00000000]java.lang.Thread.State:RUNNABLE"C2CompilerThread1"daemonprio=9tid=7ff64c80e800nid=0x117b93000waitingoncondition[00000000]java.lang.Thread.State:RUNNABLE"C2CompilerThread0"daemonprio=9tid=7ff64c80d800nid=0x117a90000waitingoncondition[00000000]java.lang.Thread.State:RUNNABLE"SignalDispatcher"daemonprio=9tid=7ff64c80d000nid=0x11798d000runnable[00000000]java.lang.Thread.State:RUNNABLE"SurrogateLockerThread(ConcurrentGC)"daemonprio=5tid=7ff64c80c000nid=0x11788a000waitingoncondition[00000000]java.lang.Thread.State:RUNNABLE"Finalizer"daemonprio=8tid=7ff64e13d800nid=0x11767f000inObject.wait()[11767e000]java.lang.Thread.State:WAITING(onobjectmonitor)atjava.lang.Object.wait(NativeMethod)-waitingon<7f44c0ed0>(ajava.lang.ref.ReferenceQueue$Lock)atjava.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)-locked<7f44c0ed0>(ajava.lang.ref.ReferenceQueue$Lock)atjava.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)atjava.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)"ReferenceHandler"daemonprio=10tid=7ff64e13c800nid=0x11757c000inObject.wait()[11757b000]java.lang.Thread.State:WAITING(onobjectmonitor)atjava.lang.Object.wait(NativeMethod)-waitingon<7f44c0018>(ajava.lang.ref.Reference$Lock)atjava.lang.Object.wait(Object.java:485)atjava.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)-locked<7f44c0018>(ajava.lang.ref.Reference$Lock)"main"prio=5tid=7ff64c800800nid=0x10f709000runnable[10f708000]java.lang.Thread.State:RUNNABLEattest.Test.main(Test.java:7)"VMThread"prio=9tid=7ff64e138000nid=0x117479000runnable"Gangworker#0(ParallelGCThreads)"prio=9tid=7ff64e000000nid=0x112b0f000runnable"Gangworker#1(ParallelGCThreads)"prio=9tid=7ff64e001000nid=0x112c12000runnable"Gangworker#2(ParallelGCThreads)"prio=9tid=7ff64e001800nid=0x112d15000runnable"Gangworker#3(ParallelGCThreads)"prio=9tid=7ff64e002000nid=0x112e18000runnable"Gangworker#4(ParallelGCThreads)"prio=9tid=7ff64e002800nid=0x112f1b000runnable"Gangworker#5(ParallelGCThreads)"prio=9tid=7ff64e003800nid=0x11301e000runnable"Gangworker#6(ParallelGCThreads)"prio=9tid=7ff64e004000nid=0x113121000runnable"Gangworker#7(ParallelGCThreads)"prio=9tid=7ff64e004800nid=0x113224000runnable"ConcurrentMark-SweepGCThread"prio=9tid=7ff64e0e2000nid=0x1170f0000runnable"Gangworker#0(ParallelCMSThreads)"prio=9tid=7ff64e0e0800nid=0x1166ea000runnable"Gangworker#1(ParallelCMSThreads)"prio=9tid=7ff64e0e1800nid=0x1167ed000runnable"VMPeriodicTaskThread"prio=10tid=7ff64c820800nid=0x117d99000waitingoncondition"ExceptionCatcherThread"prio=10tid=7ff64c801800nid=0x10f936000runnableJNIglobalreferences:963jinfo,可以打印JVM执行的参数信息,有一个非常大的作用在于,部分JVM参数在执行过程中是可以修改的,请参见这篇《通过jinfo工具在full GC前后做heap dump》,通过jinfo改变参数HeapDumpBeforeFullGC和HeapDumpAfterFullGC,输出heap dump后,再改回来。

jhat,可以比对core文件之间的对象变化,支持对象查询语言(OQL),请参见这里。

./jhat-stacktrue-refstrue-port8080-baseline/xxx/dump-baseline.core-debug1/Users/xiongyi/Documents/dump-newer.corejavap,用于反编译class文件,对于JVM指令集,这里有完整的文档。

javap-c-v./Test.classClassfilexxx/Test.classLastmodifiedNov11,2013;size441bytesmd5checksum69488187cc8a8f166bc6dd0d517fb4cbCompiledfrom"Test.java"publicclasstest.TestSourceFile:"Test.java"minorversion:0majorversion:50flags:ACC_PUBLIC,ACC_SUPERConstantpool:#1=Methodref#6.#16//java/lang/Object."":()V#2=Integer1048576#3=Fieldref#17.#18//java/lang/System.out:Ljava/io/PrintStream;#4=Methodref#19.#20//java/io/PrintStream.println:(Ljava/lang/Object;)V#5=Class#21//test/Test#6=Class#22//java/lang/Object#7=Utf8#8=Utf8()V#9=Utf8Code#10=Utf8LineNumberTable#11=Utf8main#12=Utf8([Ljava/lang/String;)V#13=Utf8StackMapTable#14=Utf8SourceFile#15=Utf8Test.java#16=NameAndType#7:#8//"":()V#17=Class#23//java/lang/System#18=NameAndType#24:#25//out:Ljava/io/PrintStream;#19=Class#26//java/io/PrintStream#20=NameAndType#27:#28//println:(Ljava/lang/Object;)V#21=Utf8test/Test#22=Utf8java/lang/Object#23=Utf8java/lang/System#24=Utf8out#25=Utf8Ljava/io/PrintStream;#26=Utf8java/io/PrintStream#27=Utf8println#28=Utf8(Ljava/lang/Object;)V{publictest.Test();flags:ACC_PUBLICCode:stack=1,locals=1,args_size=10:aload_01:invokespecial#1//Methodjava/lang/Object."":()V4:returnLineNumberTable:line4:0publicstaticvoidmain(java.lang.String[]);flags:ACC_PUBLIC,ACC_STATICCode:stack=2,locals=2,args_size=10:ldc#2//int10485762:newarraybyte4:astore_15:getstatic#3//Fieldjava/lang/System.out:Ljava/io/PrintStream;8:aload_19:invokevirtual#4//Methodjava/io/PrintStream.println:(Ljava/lang/Object;)V12:goto0LineNumberTable:line7:0line8:5line9:12StackMapTable:number_of_entries=1frame_type=0/*same*/}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航