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