本机上的java版本是jdk1.7.0_45,在bin目录下有很多的可执行程序,这些都是一些帮助编写java程序的工具
jps命令:我编写并运行一个HttpServer的java应用程序:
然后通过jps命令就可以看到当前运行的java应用程序进程
C:\Program Files\Java\jdk1.7.0_45\bin>jps -l
5448 sun.tools.jps.Jps
2608
5952 com.net.http.main.HttpServer
jstat:虚拟机统计信息监视工具:
比如jstat -gccapacity 5952就能监视java堆各个区域的最大和最小空间:
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gccapacity 5952
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN
5440.0 87360.0 5440.0 512.0 512.0 4416.0 10944.0 174784.0 10944.0 10944.0 12288.0
然后再用jstat -gcutil 5952查看各个区域的使用情况(百分比)
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gcutil 5952
S0 S1 E O P YGC YGCT FGC FGCT GCT
100.00 0.00 11.24 17.46 19.79 2 0.013 0 0.000 0.013
E为11.24表示使用了11.24%的Eden区
S0,S1是Survivor区
O表示Old老年代区
P表示Perman永久代区
Young GC发生2次,耗时0.013s
Full GC0次耗时0s
GCT为总耗时
这个时候用jstat -gccause 5952就能看到上一次GC产生的原因:这里还没有GC,就提示:No GC
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gccause 5952
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
100.00 0.00 12.59 17.46 19.79 2 0.013 0 0.000 0.013 Allocation Failure No GC
其他部分命令
C:\Program Files\Java\jdk1.7.0_45\bin>jps -l
5160 sun.tools.jps.Jps
4408
5864
5952com.net.http.main.HttpServer
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -class 5952
Loaded Bytes Unloaded Bytes Time
1987 2297.1 0 0.0 12.80
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gc 5952
S0C S1C S0U S1U EC EU OC OU PC PU
YGC YGCT FGC FGCT GCT
512.0 512.0 0.0 512.0 4416.0 1475.1 10944.0 3707.9 12288.0 5513
.8 5 0.053 0 0.000 0.053
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gccapacity 5952
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC
OC PGCMN PGCMX PGC PC YGC FGC
5440.0 87360.0 5440.0 512.0 512.0 4416.0 10944.0 174784.0 10944
.0 10944.0 12288.0 65536.0 12288.0 12288.0 5 0
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gcutil 5952
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 100.00 41.30 33.88 44.87 5 0.053 0 0.000 0.053
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gccause 5952
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC
GCC
0.00 100.00 43.72 33.88 44.87 5 0.053 0 0.000 0.053 Alloc
ation Failure No GC
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gccause 5952
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC
GCC
0.00 100.00 88.57 33.88 44.93 5 0.053 0 0.000 0.053 Alloc
ation Failure No GC
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gcnew 5952
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
512.0 512.0 0.0 512.0 1 15 256.0 4416.0 3927.0 5 0.053
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gcold 5952
PC PU OC OU YGC FGC FGCT GCT
12288.0 5521.2 10944.0 3707.9 5 0 0.000 0.053
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gcnewcapacity 5952
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX
EC YGC FGC
5440.0 87360.0 5440.0 8704.0 512.0 8704.0 512.0 69952.0
4416.0 5 0
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gcoldcapacity 5952
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
10944.0 174784.0 10944.0 10944.0 5 0 0.000 0.053
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -gcpermcapacity 5952
PGCMN PGCMX PGC PC YGC FGC FGCT GCT
12288.0 65536.0 12288.0 12288.0 5 0 0.000 0.053
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -compiler 5952
Compiled Failed Invalid Time FailedType FailedMethod
379 0 0 0.24 0
C:\Program Files\Java\jdk1.7.0_45\bin>jstat -printcompilation 5952
Compiled Size Type Method
379 439 1 com/mysql/jdbc/MysqlIO nextRow
jmap 命令:用于生成堆存储快照,还可以查询finalize执行队列,java堆得空间使用率和当前用的那种收集器等
执行jmap -dump:format=b,file=httpserver.bin 5952之后,能够在C:\Program Files\Java\jdk1.7.0_45\bin目录下生成一个httpserver.bin
这个就是dump文件
执行jmap -finalizerinfo 5952可以查看等待执行finalization方法的对象个数
C:\Program Files\Java\jdk1.7.0_45\bin>jmap -finalizerinfo 5952
Attaching to process ID 5952, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 24.45-b08
Number of objects pending for finalization: 0
执行jmap -heap 5952:查看堆信息:
C:\Program Files\Java\jdk1.7.0_45\bin>jmap -heap 5952
Attaching to process ID 5952, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 24.45-b08
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 268435456 (256.0MB)
NewSize = 1048576 (1.0MB)
MaxNewSize = 4294901760 (4095.9375MB)
OldSize = 4194304 (4.0MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 12582912 (12.0MB)
MaxPermSize = 67108864 (64.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 5046272 (4.8125MB)
used = 825168 (0.7869415283203125MB)
free = 4221104 (4.0255584716796875MB)
16.352031757305195% used
Eden Space:
capacity = 4521984 (4.3125MB)
used = 300880 (0.2869415283203125MB)
free = 4221104 (4.0255584716796875MB)
6.653716598731884% used
From Space:
capacity = 524288 (0.5MB)
used = 524288 (0.5MB)
free = 0 (0.0MB)
100.0% used
To Space:
capacity = 524288 (0.5MB)
used = 0 (0.0MB)
free = 524288 (0.5MB)
0.0% used
tenured generation:
capacity = 11206656 (10.6875MB)
used = 4615144 (4.401344299316406MB)
free = 6591512 (6.286155700683594MB)
41.18216888249269% used
Perm Generation:
capacity = 12582912 (12.0MB)
used = 5653752 (5.391838073730469MB)
free = 6929160 (6.608161926269531MB)
44.931983947753906% used
14919 interned Strings occupying 1175008 bytes.
C:\Program Files\Java\jdk1.7.0_45\bin>jhat httpserver.bin
Reading from httpserver.bin...
Dump file created Wed Apr 15 01:05:56 CST 2015
Snapshot read, resolving...
Resolving 95873 objects...
Chasing references, expect 19 dots...................
Eliminating duplicate references...................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
然后访问http://localhost:7000就能看到分析结果了
分析内存泄露可以用到其中的Heap Histogram----可以找到内存中总容量最大的对象:
Other Queries
- All classes including platform
- Show all members of the rootset
- Show instance counts for all classes (including platform)
- Show instance counts for all classes (excluding platform)
- Show heap histogram
- Show finalizer summary
- Execute Object Query Language (OQL) query
都是三个,每个对象大小的8(单位不知道是什么)
class com.net.http.processors.GetProcessor | 3 | 24 |
class com.net.http.processors.HeadersProcessor | 3 | 24 |
class com.net.http.processors.HttpRequestProcessor | 3 | 24 |
也可以通过OQL来查找对象的情况
Execute Object Query Language (OQL) query
jstack可以分析栈
比如我输入命令:jstack -l 5952
C:\Program Files\Java\jdk1.7.0_45\bin>jstack -l 5952
2015-04-15 01:23:24
Full thread dump Java HotSpot(TM) Client VM (24.45-b08 mixed mode, sharing):
"nioEventLoopGroup-3-4" prio=10 tid=0x040acc00 nid=0x14f0 runnable [0x0466f000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl.doSelect(Unknown Source)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
- locked <0x293d5258> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x2929ae88> (a java.util.Collections$UnmodifiableSet)
- locked <0x293a2d48> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(Unknown Source)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:622)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:310)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFact
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
"nioEventLoopGroup-3-3" prio=10 tid=0x040ac800 nid=0x1630 runnable [0x0476f000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl.doSelect(Unknown Source)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
- locked <0x293d54e0> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x29298c28> (a java.util.Collections$UnmodifiableSet)
- locked <0x293a2dc0> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(Unknown Source)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:622)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:310)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFact
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
"nioEventLoopGroup-3-2" prio=10 tid=0x040ac000 nid=0x9c4 runnable [0x0470f000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl.doSelect(Unknown Source)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
- locked <0x293a3848> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x292969c8> (a java.util.Collections$UnmodifiableSet)
- locked <0x293a2e38> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(Unknown Source)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:622)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:310)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFact
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
"nioEventLoopGroup-3-1" prio=10 tid=0x040ab800 nid=0x1748 runnable [0x0105f000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl.doSelect(Unknown Source)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
- locked <0x293a3b20> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x29294768> (a java.util.Collections$UnmodifiableSet)
- locked <0x293a2eb0> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(Unknown Source)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:622)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:310)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFact
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
"nioEventLoopGroup-2-1" prio=10 tid=0x040ab400 nid=0x46c runnable [0x0459f000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl.doSelect(Unknown Source)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
- locked <0x293779c0> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x292924f8> (a java.util.Collections$UnmodifiableSet)
- locked <0x29377948> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(Unknown Source)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:622)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:310)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFact
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
"Service Thread" daemon prio=6 tid=0x00daf800 nid=0x13cc runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C1 CompilerThread0" daemon prio=10 tid=0x00daa400 nid=0xec8 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Attach Listener" daemon prio=10 tid=0x00d9c400 nid=0x13e8 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Signal Dispatcher" daemon prio=10 tid=0x00d9b000 nid=0x1780 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Finalizer" daemon prio=8 tid=0x00d35c00 nid=0x3c4 in Object.wait() [0x03eff000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x29377ce0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
- locked <0x29377ce0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
Locked ownable synchronizers:
- None
"Reference Handler" daemon prio=10 tid=0x00d30c00 nid=0x994 in Object.wait() [0x03e1f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x29377d68> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
- locked <0x29377d68> (a java.lang.ref.Reference$Lock)
Locked ownable synchronizers:
- None
"main" prio=6 tid=0x0056c400 nid=0x17dc in Object.wait() [0x0052f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x24190c78> (a io.netty.channel.AbstractChannel$CloseFuture)
at java.lang.Object.wait(Object.java:503)
at io.netty.util.concurrent.DefaultPromise.await(DefaultPromise.java:254)
- locked <0x24190c78> (a io.netty.channel.AbstractChannel$CloseFuture)
at io.netty.channel.DefaultChannelPromise.await(DefaultChannelPromise.java:129)
at io.netty.channel.DefaultChannelPromise.await(DefaultChannelPromise.java:28)
at io.netty.util.concurrent.DefaultPromise.sync(DefaultPromise.java:218)
at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:117)
at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:28)
at com.net.http.main.HttpServer.main(HttpServer.java:59)
Locked ownable synchronizers:
- None
"VM Thread" prio=10 tid=0x00d2f000 nid=0x179c runnable
"VM Periodic Task Thread" prio=10 tid=0x00db1800 nid=0x11b0 waiting on condition
JNI global references: 215
C:\Program Files\Java\jdk1.7.0_45\bin>