[JAVA] Verwenden wir jcmd

Ich bin sicher, Sie haben "jstack" verwendet, um Stack-Traces auszugeben, und "jmap", um Heap-Dumps zu erhalten.

Aber in letzter Zeit (?) Kann ich beide mit nur "jcmd" abdecken.

Lassen Sie uns zuerst jcmd ohne Argumente ausführen.

$ jcmd
62818 com.example.demo.DemoApplication
62819 jdk.jcmd/sun.tools.jcmd.JCmd
62810 org.apache.maven.wrapper.MavenWrapperMain spring-boot:run

Auf diese Weise werden die PID und die Hauptklasse der auf dem Computer ausgeführten Java-Anwendung aufgelistet.

Als nächstes übergeben wir die PID an jcmd. Hier übergeben wir die PID von "DemoApplication".

$ jcmd 62818
62818:
The following commands are available:
Compiler.CodeHeap_Analytics
Compiler.codecache
Compiler.codelist
Compiler.directives_add
Compiler.directives_clear
Compiler.directives_print
Compiler.directives_remove
Compiler.queue
GC.class_histogram
GC.class_stats
GC.finalizer_info
GC.heap_dump
GC.heap_info
GC.run
GC.run_finalization
JFR.check
JFR.configure
JFR.dump
JFR.start
JFR.stop
JVMTI.agent_load
JVMTI.data_dump
ManagementAgent.start
ManagementAgent.start_local
ManagementAgent.status
ManagementAgent.stop
Thread.print
VM.class_hierarchy
VM.classloader_stats
VM.classloaders
VM.command_line
VM.dynlibs
VM.flags
VM.info
VM.log
VM.metaspace
VM.native_memory
VM.print_touched_methods
VM.set_flag
VM.stringtable
VM.symboltable
VM.system_properties
VM.systemdictionary
VM.uptime
VM.version
help

For more information about a specific command use 'help <command>'.

Dies ist eine Liste der für diesen Prozess verfügbaren Befehle.

Lassen Sie uns einen Stack-Trace ausgeben.

$ jcmd 62818 Thread.print
62818:
2019-12-04 08:49:43
Full thread dump OpenJDK 64-Bit Server VM (11.0.2+9 mixed mode):

(Weggelassen)

"Common-Cleaner" #11 daemon prio=8 os_prio=31 cpu=1.60ms elapsed=263.23s tid=0x00007f8650010800 nid=0x5c03 in Object.wait()  [0x000070000b852000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait([email protected]/Native Method)
	- waiting on <0x000000060003bee0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:155)
	- waiting to re-lock in wait() <0x000000060003bee0> (a java.lang.ref.ReferenceQueue$Lock)
	at jdk.internal.ref.CleanerImpl.run([email protected]/CleanerImpl.java:148)
	at java.lang.Thread.run([email protected]/Thread.java:834)
	at jdk.internal.misc.InnocuousThread.run([email protected]/InnocuousThread.java:134)

"Catalina-utility-1" #15 prio=1 os_prio=31 cpu=36.80ms elapsed=257.29s tid=0x00007f864802a800 nid=0x7003 waiting on condition  [0x000070000c77f000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x000000061c615798> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:194)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:2081)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take([email protected]/ScheduledThreadPoolExecutor.java:1177)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take([email protected]/ScheduledThreadPoolExecutor.java:899)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1054)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1114)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:628)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run([email protected]/Thread.java:834)

(Unten weggelassen)

Lassen Sie uns einen Heap-Dump bekommen.

$ ls
$ jcmd 62818 GC.heap_dump `pwd`/demo.hprof
62818:
Heap dump file created
$ ls
demo.hprof

Es ist einfach, weil Sie sich nicht an mehrere Befehle wie "jstack" und "jmap" wie diesen erinnern müssen, sondern nur an "jcmd".

Recommended Posts

Verwenden wir jcmd
[Swift] Verwenden wir die Erweiterung
[Swift] Verwenden wir die segmentierte Steuerung
[spring] Verwenden wir Spring Data JPA
Verwenden wir Set more [Collections Framework]
Verwenden wir Twilio in Java! (Einführung)
Verwenden wir Reflection Private Method Access
Verwenden wir es, nachdem wir sudo verstanden haben!
Verwenden Sie before_action! !!
Verwenden Sie XMLHttpRequest
Verwenden wir den Swift Package Manager (SwiftPM) ~ Creation ~
Verwenden Sie AutosizingTextView
Verwenden wir den Swift Package Manager (SwiftPM) ~ Einführung ~
Verwenden wir das Pulldown-Menü (Auswahlfeld). Wählen Sie das Buchungsziel aus.
Verwenden wir Java New FileIO! (Einführung für Anfänger)