JVM高级特性与最佳实践-虚拟机性能监控与故障处理

本机上的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

可以看到自己定义的类的对象大小:

都是三个,每个对象大小的8(单位不知道是什么)

class com.net.http.processors.GetProcessor324
class com.net.http.processors.HeadersProcessor324
class com.net.http.processors.HttpRequestProcessor324

也可以通过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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值