Jmap:可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等

Jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。

使用方法 jmap -histo pid。如果使用SHELL ,可采用jmap -histo pid>a.log日志将其保存到文件 中,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=outfile 3024可以 将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具)。

Code:

D:\Program Files\Java\jdk1.8.0_102\bin              
$ jmap -heap 47960                                  
Attaching to process ID 47960, please wait...       
Debugger attached successfully.                     
Server compiler detected.                           
JVM version is 25.102-b14                           
                                                    
using thread-local object allocation.               
Parallel GC with 4 thread(s)                        
                                                    
Heap Configuration:                                 
   MinHeapFreeRatio         = 0                     
   MaxHeapFreeRatio         = 100                   
   MaxHeapSize              = 734003200 (700.0MB)   
   NewSize                  = 42991616 (41.0MB)     
   MaxNewSize               = 244318208 (233.0MB)   
   OldSize                  = 87031808 (83.0MB)     
   NewRatio                 = 2                     
   SurvivorRatio            = 8                     
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB) 
   MaxMetaspaceSize         = 17592186044415 MB     
   G1HeapRegionSize         = 0 (0.0MB)             
                                                    
Heap Usage:                                         
PS Young Generation                                 
Eden Space:                                         
   capacity = 32505856 (31.0MB)                     
   used     = 19961640 (19.036903381347656MB)       
   free     = 12544216 (11.963096618652344MB)       
   61.40936574628276% used                          
From Space:                                         
   capacity = 5242880 (5.0MB)                       
   used     = 4268096 (4.07037353515625MB)          
   free     = 974784 (0.92962646484375MB)           
   81.407470703125% used                            
To Space:                                           
   capacity = 5242880 (5.0MB)                       
   used     = 0 (0.0MB)                             
   free     = 5242880 (5.0MB)                       
   0.0% used                                        
PS Old Generation                                   
   capacity = 87031808 (83.0MB)                     
   used     = 16867360 (16.085968017578125MB)       
   free     = 70164448 (66.91403198242188MB)        
   19.380684358527862% used                         
                                                    
5691 interned Strings occupying 486856 bytes.       

https://www.cnblogs.com/qlqwjy/p/7953491.html

jps:显示当前所有java进程pid的命令,简单实用

D:\Program Files\Java\jdk1.8.0_102\bin
$ jps
15856 RemoteMavenServer
17412 Jps
47960 Launcher
5224

jstack:

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。

另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

So,jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。

D:\Program Files\Java\jdk1.8.0_102\bin
$ jstack 15856
2018-03-21 14:31:40
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.102-b14 mixed mode):
......

具体:

D:\Program Files\Java\jdk1.8.0_102\bin
$ jstack 15856
2018-03-21 14:31:40
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.102-b14 mixed mode):

"RMI RenewClean-[localhost:2913]" #18 daemon prio=5 os_prio=0 tid=0x0000000016d52800 nid=0x1284 in Object.wait() [0x0000000017a7e000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x00000000d00fbc40> (a java.lang.ref.ReferenceQueue$Lock)
        at sun.rmi.transport.DGCClient$EndpointEntry$RenewCleanThread.run(DGCClient.java:553)
        at java.lang.Thread.run(Thread.java:745)

"RMI Scheduler(0)" #17 daemon prio=5 os_prio=0 tid=0x0000000016d50000 nid=0x27d4 waiting on condition [0x000000001797e000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000d0010a50> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

"GC Daemon" #14 daemon prio=2 os_prio=-2 tid=0x0000000016b8f000 nid=0x421c in Object.wait() [0x000000001757f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at sun.misc.GC$Daemon.run(GC.java:117)
        - locked <0x00000000d0009450> (a sun.misc.GC$LatencyLock)

"RMI Reaper" #13 prio=5 os_prio=0 tid=0x0000000016b8e000 nid=0x3b18 in Object.wait() [0x000000001747f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x00000000d00014d0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        at sun.rmi.transport.ObjectTable$Reaper.run(ObjectTable.java:351)
        at java.lang.Thread.run(Thread.java:745)

"RMI TCP Accept-0" #12 daemon prio=5 os_prio=0 tid=0x0000000016b8d800 nid=0x4890 runnable [0x000000001737e000]
   java.lang.Thread.State: RUNNABLE
        at java.net.DualStackPlainSocketImpl.accept0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131)
        at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
        at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199)
        - locked <0x00000000d000f990> (a java.net.SocksSocketImpl)
        at java.net.ServerSocket.implAccept(ServerSocket.java:545)
        at java.net.ServerSocket.accept(ServerSocket.java:513)
        at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:400)
        at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:372)
        at java.lang.Thread.run(Thread.java:745)

"RMI TCP Accept-33846" #11 daemon prio=5 os_prio=0 tid=0x00000000160a0000 nid=0x2ee8 runnable [0x0000000016a7e000]
   java.lang.Thread.State: RUNNABLE
        at java.net.DualStackPlainSocketImpl.accept0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131)
        at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
        at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199)
        - locked <0x00000000d0016fd8> (a java.net.SocksSocketImpl)
        at java.net.ServerSocket.implAccept(ServerSocket.java:545)
        at java.net.ServerSocket.accept(ServerSocket.java:513)
        at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:400)
        at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:372)
        at java.lang.Thread.run(Thread.java:745)

"Service Thread" #9 daemon prio=9 os_prio=0 tid=0x0000000015ef7800 nid=0x2538 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x0000000015eb2000 nid=0x2534 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x0000000015e7b000 nid=0x45b0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x0000000015e79000 nid=0x2500 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0000000014abd800 nid=0x2530 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x0000000014a71800 nid=0x24fc runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000000002cee800 nid=0xcac in Object.wait() [0x0000000015dbf000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x00000000d0009eb0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000002ce5000 nid=0x32e0 in Object.wait() [0x0000000015cbe000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x00000000d0001688> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"main" #1 prio=5 os_prio=0 tid=0x0000000002bf4000 nid=0x17ac in Object.wait() [0x000000000289f000]

   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at com.intellij.execution.rmi.RemoteServer.start(RemoteServer.java:80)
        - locked <0x00000000d0009ef0> (a java.lang.Object)
        at org.jetbrains.idea.maven.server.RemoteMavenServer.main(RemoteMavenServer.java:22)

"VM Thread" os_prio=2 tid=0x0000000014a27000 nid=0xb18 runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000002c0a000 nid=0x3ca8 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002c0b800 nid=0x35f8 runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000002c0d800 nid=0x1044 runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000002c0f000 nid=0x3ff8 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x0000000015f45800 nid=0x293c waiting on condition

JNI global references: 261
View Code

相关文章: