• 在实际项目过程中,受事业环境因素影响,线上排查问题等情况下,更多的是通过 java 指令来查看项目性能情况.

#Java 性能调优 - 指令 (Java8)

# 前言

  • 在实际项目过程中,受事业环境因素影响,线上排查问题等情况下,更多的是通过 java 指令来查看项目性能情况;
  • 以下是自己在 Java8 版本上常用指令总结,若有总结错误 / 不到位 /… 问题,请联系更正,谢谢!

# jps

  • 显示当前所有 Java 进程相关信息;

jps -h

➜  ~ jps -h
usage: jps [--help]
       jps [-q] [-mlvV] [<hostid>]

Definitions:
    <hostid>:      <hostname>[:<port>]
    -? -h --help -help: Print this help message and exit.

# -q

  • 显示 Java 线程 Pid

jps -q

➜  ~ jps -q
708
789
1719
1289
1290

# -l

  • 显示 Pid 应用程序启动类的包名

jps -l

➜  ~ jps -l
708 
789 org.jetbrains.idea.maven.server.RemoteMavenServer
1289 org.jetbrains.jps.cmdline.Launcher
1290 com.smile.SmileCompanyApplication
1725 jdk.jcmd/sun.tools.jps.Jps

# -v

  • 显示 Pid 应用程序类名 配置的 JVM 参数

jps -v

➜  ~ jps -v
1731 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk-13.0.1.jdk/Contents/Home -Xms8m -Djdk.module.main=jdk.jcmd
708  -Xms128m -Xmx2048m -XX:ReservedCodeCacheSize=240m -XX:+UseCompressedOops -Dfile.encoding=UTF-8 -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -XX:CICompilerCount=2 -Dsun.io.useCanonPrefixCache=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Djdk.attach.allowAttachSelf -Dkotlinx.coroutines.debug=off -Djdk.module.illegalAccess.silent=true -Xverify:none -XX:ErrorFile=/Users/smile/java_error_in_idea_%p.log -XX:HeapDumpPath=/Users/smile/java_error_in_idea.hprof -javaagent:/Users/smile/workSpace/idea/jetbrains-agent.jar -Djb.vmOptionsFile=/Users/smile/Library/Preferences/IntelliJIdea2019.2/idea.vmoptions -Didea.home.path=/Applications/IntelliJ IDEA.app/Contents -Didea.executable=idea -Didea.paths.selector=IntelliJIdea2019.2
789 RemoteMavenServer -Djava.awt.headless=true -Dmaven.defaultProjectBuilder.disableGlobalModelCache=true -Xmx768m -Didea.maven.embedder.version=3.5.4 -Dmaven.ext.class.path=/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven-event-listener.jar -Dfile.encoding=UTF-8
1289 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=/Users/smile/workSpace/resource/git/temp/smile-company -Dpreload.config.path=/Users/smile/Library/Preferences/IntelliJIdea2019.2/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=8732127973280526886 -Dfile.encoding=UTF-8 -Duser.language=ja -Duser.country=CN -Didea.paths.selector=IntelliJIdea2019.2 -Didea.home.path=/Applications/IntelliJ IDEA.app/Contents -Didea.config.path=/Users/smile/Library/Preferences/IntelliJIdea2019.2 -Didea.plugins.path=/Users/smile/Library/Application Support/IntelliJIdea2019.2 -Djps.log.dir=/Users/smile/Library/Logs/IntelliJIdea2019.2/build-log -Djps.fallback.jdk.home=/Applications/IntelliJ IDEA.app/Contents/jbr/Contents/Home -Djps.fallback.jdk.version=11.0.4 -Dio.netty.noUnsafe=true -Djava.io.tmpdir=/Users/smile/Library/Caches/IntelliJIdea2019.2/compile-server/smile-company_f76f6fba/_t
1290 SmileCompanyApplication -verbose:gc -XX:+UseG1GC -XX:+PrintGCDetails -XX:-PrintCommandLineFlags -XX:+ExplicitGCInvokesConcurrent -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.profiles.active=local -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=49797:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8

# 常用方式

jps -l
jps -lv

# jinfo

  • 显示对应 Java 进程的 Jvm 配置信息

jinfo -h

➜  ~ jinfo -h
Usage:
    jinfo <option> <pid>
       (to connect to a running process)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both VM flags and system properties
    -? | -h | --help | -help to print this help message

# -flags

  • 显示对应进程所有 Jvm 属性信息

jps -flags pid

➜  ~ jinfo -flags 1290 
VM Flags:
-XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:ConcGCThreads=3 -XX:+ExplicitGCInvokesConcurrent -XX:G1HeapRegionSize=2097152 -XX:InitialHeapSize=536870912 -XX:+ManagementServer -XX:MarkStackSize=4194304 -XX:MaxHeapSize=8589934592 -XX:MaxNewSize=5152702464 -XX:MinHeapDeltaBytes=2097152 -XX:-PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 

# -flag <name>

  • 显示对应 Java 进程 Jvm 属性名的值

jinfo -flag name pid

➜  ~ jinfo -flag MinHeapDeltaBytes 1290
-XX:MinHeapDeltaBytes=2097152

# -flag [+|-] <name>

  • 为对应 Java 进程添加 / 减少 Jvm 属性

jinfo -flag +|- name pid

➜  ~ jinfo -flags 1290                 
VM Flags:
-XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:ConcGCThreads=3 -XX:+ExplicitGCInvokesConcurrent -XX:G1HeapRegionSize=2097152 -XX:InitialHeapSize=536870912 -XX:+ManagementServer -XX:MarkStackSize=4194304 -XX:MaxHeapSize=8589934592 -XX:MaxNewSize=5152702464 -XX:MinHeapDeltaBytes=2097152 -XX:-PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 
➜  ~ jinfo -flag +PrintGCDateStamps 1290
➜  ~ jinfo -flags 1290                  
VM Flags:
-XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:ConcGCThreads=3 -XX:+ExplicitGCInvokesConcurrent -XX:G1HeapRegionSize=2097152 -XX:InitialHeapSize=536870912 -XX:+ManagementServer -XX:MarkStackSize=4194304 -XX:MaxHeapSize=8589934592 -XX:MaxNewSize=5152702464 -XX:MinHeapDeltaBytes=2097152 -XX:-PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC

# -sysprops

  • 显示对应 Java 进程在当前系统的属性信息

jinfo -sysprops pid

➜  ~ jinfo -flags 1290                  
VM Flags:
-XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:ConcGCThreads=3 -XX:+ExplicitGCInvokesConcurrent -XX:G1HeapRegionSize=2097152 -XX:InitialHeapSize=536870912 -XX:+ManagementServer -XX:MarkStackSize=4194304 -XX:MaxHeapSize=8589934592 -XX:MaxNewSize=5152702464 -XX:MinHeapDeltaBytes=2097152 -XX:-PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 
➜  ~ jinfo -sysprops 1290
Java System Properties:
#Sun Feb 23 13:07:20 CST 2020
spring.output.ansi.enabled=always
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib
java.vm.version=25.181-b13
gopherProxySet=false
java.vm.vendor=Oracle Corporation
java.vendor.url=http\://java.oracle.com/
path.separator=\:
java.rmi.server.randomIDs=true
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=unknown
java.vm.specification.name=Java Virtual Machine Specification
user.dir=/Users/smile/workSpace/resource/git/temp/smile-company
PID=1290
java.runtime.version=1.8.0_181-b13
java.awt.graphicsenv=sun.awt.CGraphicsEnvironment
java.endorsed.dirs=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/endorsed
os.arch=x86_64
spring.profiles.active=local
java.io.tmpdir=/var/folders/yx/vrd87ppn3rxbmqh0h6k6vl500000gn/T/
line.separator=\n
java.vm.specification.vendor=Oracle Corporation
os.name=Mac OS X
sun.jnu.encoding=UTF-8
java.library.path=/Users/smile/Library/Java/Extensions\:/Library/Java/Extensions\:/Network/Library/Java/Extensions\:/System/Library/Java/Extensions\:/usr/lib/java\:.
spring.beaninfo.ignore=true
spring.jmx.enabled=true
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
spring.liveBeansView.mbeanDomain=
os.version=10.15.3
user.home=/Users/smile
user.timezone=Asia/Shanghai
java.awt.printerjob=sun.lwawt.macosx.CPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
java.class.path=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/charsets.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/deploy.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/cldrdata.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/dnsns.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/jaccess.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/jfxrt.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/localedata.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/nashorn.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunec.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/zipfs.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/javaws.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jce.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfr.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfxswt.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jsse.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/management-agent.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/plugin.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/resources.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/rt.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/ant-javafx.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/dt.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/javafx-mx.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/jconsole.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/packager.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/sa-jdi.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/tools.jar\:/Users/smile/workSpace/resource/git/temp/smile-company/target/classes\:/Users/smile/workSpace/maven/localRepository/org/springframework/boot/spring-boot-starter/2.2.1.RELEASE/spring-boot-starter-2.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/boot/spring-boot/2.2.1.RELEASE/spring-boot-2.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/spring-context/5.2.1.RELEASE/spring-context-5.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/spring-aop/5.2.1.RELEASE/spring-aop-5.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/spring-expression/5.2.1.RELEASE/spring-expression-5.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/boot/spring-boot-autoconfigure/2.2.1.RELEASE/spring-boot-autoconfigure-2.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/spring-core/5.2.1.RELEASE/spring-core-5.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/spring-jcl/5.2.1.RELEASE/spring-jcl-5.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/boot/spring-boot-starter-log4j2/2.2.1.RELEASE/spring-boot-starter-log4j2-2.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/apache/logging/log4j/log4j-slf4j-impl/2.12.1/log4j-slf4j-impl-2.12.1.jar\:/Users/smile/workSpace/maven/localRepository/org/slf4j/slf4j-api/1.7.29/slf4j-api-1.7.29.jar\:/Users/smile/workSpace/maven/localRepository/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar\:/Users/smile/workSpace/maven/localRepository/org/apache/logging/log4j/log4j-core/2.12.1/log4j-core-2.12.1.jar\:/Users/smile/workSpace/maven/localRepository/org/apache/logging/log4j/log4j-jul/2.12.1/log4j-jul-2.12.1.jar\:/Users/smile/workSpace/maven/localRepository/org/slf4j/jul-to-slf4j/1.7.29/jul-to-slf4j-1.7.29.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/boot/spring-boot-starter-webflux/2.2.1.RELEASE/spring-boot-starter-webflux-2.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/boot/spring-boot-starter-json/2.2.1.RELEASE/spring-boot-starter-json-2.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/com/fasterxml/jackson/core/jackson-databind/2.10.0/jackson-databind-2.10.0.jar\:/Users/smile/workSpace/maven/localRepository/com/fasterxml/jackson/core/jackson-annotations/2.10.0/jackson-annotations-2.10.0.jar\:/Users/smile/workSpace/maven/localRepository/com/fasterxml/jackson/core/jackson-core/2.10.0/jackson-core-2.10.0.jar\:/Users/smile/workSpace/maven/localRepository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.0/jackson-datatype-jdk8-2.10.0.jar\:/Users/smile/workSpace/maven/localRepository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.0/jackson-datatype-jsr310-2.10.0.jar\:/Users/smile/workSpace/maven/localRepository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.10.0/jackson-module-parameter-names-2.10.0.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/boot/spring-boot-starter-reactor-netty/2.2.1.RELEASE/spring-boot-starter-reactor-netty-2.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/io/projectreactor/netty/reactor-netty/0.9.1.RELEASE/reactor-netty-0.9.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-codec-http/4.1.43.Final/netty-codec-http-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-common/4.1.43.Final/netty-common-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-buffer/4.1.43.Final/netty-buffer-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-transport/4.1.43.Final/netty-transport-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-resolver/4.1.43.Final/netty-resolver-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-codec/4.1.43.Final/netty-codec-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-codec-http2/4.1.43.Final/netty-codec-http2-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-handler/4.1.43.Final/netty-handler-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-handler-proxy/4.1.43.Final/netty-handler-proxy-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-codec-socks/4.1.43.Final/netty-codec-socks-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-transport-native-epoll/4.1.43.Final/netty-transport-native-epoll-4.1.43.Final-linux-x86_64.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-transport-native-unix-common/4.1.43.Final/netty-transport-native-unix-common-4.1.43.Final.jar\:/Users/smile/workSpace/maven/localRepository/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/boot/spring-boot-starter-validation/2.2.1.RELEASE/spring-boot-starter-validation-2.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/jakarta/validation/jakarta.validation-api/2.0.1/jakarta.validation-api-2.0.1.jar\:/Users/smile/workSpace/maven/localRepository/org/hibernate/validator/hibernate-validator/6.0.18.Final/hibernate-validator-6.0.18.Final.jar\:/Users/smile/workSpace/maven/localRepository/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final.jar\:/Users/smile/workSpace/maven/localRepository/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/spring-beans/5.2.1.RELEASE/spring-beans-5.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/springframework/spring-webflux/5.2.1.RELEASE/spring-webflux-5.2.1.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/synchronoss/cloud/nio-multipart-parser/1.1.0/nio-multipart-parser-1.1.0.jar\:/Users/smile/workSpace/maven/localRepository/org/synchronoss/cloud/nio-stream-storage/1.1.3/nio-stream-storage-1.1.3.jar\:/Users/smile/workSpace/maven/localRepository/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar\:/Users/smile/workSpace/maven/localRepository/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar\:/Users/smile/workSpace/maven/localRepository/io/netty/netty-all/4.1.44.Final/netty-all-4.1.44.Final.jar\:/Users/smile/workSpace/maven/localRepository/io/projectreactor/reactor-core/3.3.0.RELEASE/reactor-core-3.3.0.RELEASE.jar\:/Users/smile/workSpace/maven/localRepository/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar\:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar
user.name=smile
com.sun.management.jmxremote=
java.vm.specification.version=1.8
sun.java.command=com.smile.SmileCompanyApplication
java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre
sun.arch.data.model=64
user.language=ja
java.specification.vendor=Oracle Corporation
org.apache.logging.log4j.assignedSequences=8593
awt.toolkit=sun.lwawt.macosx.LWCToolkit
java.vm.info=mixed mode
java.version=1.8.0_181
java.ext.dirs=/Users/smile/Library/Java/Extensions\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext\:/Library/Java/Extensions\:/Network/Library/Java/Extensions\:/System/Library/Java/Extensions\:/usr/lib/java
sun.boot.class.path=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/resources.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/rt.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/sunrsasign.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jsse.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jce.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/charsets.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfr.jar\:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/classes
java.awt.headless=true
java.vendor=Oracle Corporation
spring.application.admin.enabled=true
file.separator=/
java.vendor.url.bug=http\://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeBig
sun.cpu.endian=little
sun.cpu.isalist=

# 常用方式

jinfo <pid>
jinfo -flags <pid>
jinfo -sysprops <pid>

# jstat

  • 显示对应 Java 进程性能统计信息

jstat -h

➜  ~ jstat -h
Usage: jstat --help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:
  <option>      An option reported by the -options option
  <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                     <lvmid>[@<hostname>[:<port>]]
                Where <lvmid> is the local vm identifier for the target
                Java virtual machine, typically a process id; <hostname> is
                the name of the host running the target Java virtual machine;
                and <port> is the port number for the rmiregistry on the
                target host. See the jvmstat documentation for a more complete
                description of the Virtual Machine Identifier.
  <lines>       Number of samples between header lines.
  <interval>    Sampling interval. The following forms are allowed:
                    <n>["ms"|"s"]
                Where <n> is an integer and the suffix specifies the units as 
                milliseconds("ms") or seconds("s"). The default units are "ms".
  <count>       Number of samples to take before terminating.
  -J<flag>      Pass <flag> directly to the runtime system.
  -? -h --help  Prints this help message.
  -help         Prints this help message.

# -options

  • 显示所有可查看性能统计信息的选项

jstat -options

➜  ~ jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
# -class
  • 显示对应 Java 进程加载类的相关统计信息
    • Loaded: 加载类数量
    • Bytes: 加载字节占内存容量
    • Unloaded: 未加载类数量
    • Bytes: 未加载字节占内存容量
    • Time: 加载和卸载类所占用时间

jstat -class pid

➜  ~ jstat -class 1290
Loaded  Bytes     Unloaded Bytes      Time   
  6713 12073.0        0     0.0       8.32
# -compiler
  • 显示对应 Java 进程编辑相关统计信息
    • Compiled: 执行编译的任务数
    • Failed: 编译失败的任务数
    • Invalid: 编译无效的任务数
    • Time: 执行编译所占用时间
    • FailedType: 上次编译失败的编译类型
    • FailedMethod: 上次编译失败的类名和方法

jstat -compiler pid

➜  ~ jstat -compiler 1290
Compiled Failed Invalid   Time   FailedType FailedMethod
    2504   0       0      0.50       0
# -gc
  • GC 过程的统计信息 (KB)
    • S0C: 年轻代第一个 Survivor (幸存者) 区内存容量
    • S1C: 年轻代第二个 Survivor (幸存者) 区内存容量
    • S0U: 年轻代第一个 Survivor (幸存者) 区已使用内存容量
    • S1U: 年轻代第二个 Survivor (幸存者) 区已使用内存容量
    • EC: 年轻代 Eden 区内存容量
    • EU: 年轻代 Eden 区已使用内存容量
    • OC: 老年代内存容量
    • OU: 老年代已使用内存容量
    • MC: 元空间内存容量
    • MU: 元空间已使用内存容量
    • CCSC: 压缩的类空间内存容量
    • CCSU: 压缩的类空间已使用内存容量
    • YGC: 年轻代 GC 次数
    • YGCT: 年轻代 GC 共占用时间
    • FGC: 老年代 GC 次数
    • FGCT: 老年代 GC 共占用时间
    • CGC: GC 过程中 Stop The World (STW) 次数
    • CGCT: GC 过程中 Stop The World (STW) 共占用时间
    • GCT: GC 共占用时间

jstat -gc pid

➜  ~ jstat -gc 1290
 S0C    S1C    S0U     S1U      EC       EU        OC         OU       MC       MU     CCSC   CCSU      YGC   YGCT   FGC     FGCT   CGC    CGCT   GCT   
 0.0   12288.0  0.0   12288.0 317440.0 157696.0  194560.0     0.0     21376.0 20648.7 2944.0 2732.8      3    0.019   0      0.000   -      -    0.019
# -gccapacity
  • GC 过程的统计信息 (KB)
    • NGCMN: 新生代最小内存容量
    • NGCMX: 新生代最大内存容量
    • NGC: 当前新生代内存容量
    • S0C: 当前新生代第一个 Survivor (幸存者) 区内存容量
    • S1C: 当前新生代第二个 Survivor (幸存者) 区内存容量
    • EC: 当前新生代 Eden 区内存容量
    • OGCMN: 老年代最小内存容量
    • OGCMX: 老年代最大内存容量
    • OGC: 当前老年代新生成的内存容量
    • OC: 当前老年代内存容量
    • MCMN: 元空间最小内存容量
    • MCMX: 元空间最大内存容量
    • MC: 当前元空间内存容量
    • CCSMN: 压缩的类空间最小内存容量
    • CCSMX: 压缩的类空间最大内存容量
    • CCSC: 当前压缩类空间内存容量
    • YGC: 年轻代 GC 次数
    • FGC: 老年代 GC 次数
    • CGC: GC 过程中 Stop The World (STW) 次数

jstat -gccapacity pid

➜  ~ jstat -gccapacity 1290
 NGCMN  NGCMX     NGC     S0C  S1C      EC      OGCMN  OGCMX       OGC         OC       MCMN   MCMX       MC     CCSMN    CCSMX      CCSC    YGC   FGC   CGC 
  0.0 8388608.0 329728.0  0.0 12288.0 317440.0   0.0  8388608.0   194560.0   194560.0    0.0 1067008.0  21376.0   0.0    1048576.0   2944.0   3     0     -
# -gccause
  • 最近一次 GC 的统计信息
    • S0: 当前新生代第一个 Survivor (幸存者) 区内存利用率
    • S1: 当前新生代第二个 Survivor (幸存者) 区内存利用率
    • E: 当前新生代 Eden 区内存利用率
    • O: 当前老年代内存利用率
    • M: 当前元空间内存利用率
    • CCS: 压缩的类空间内存利用率
    • YGC: 年轻代 GC 次数
    • YGCT: 年轻代 GC 共占用时间
    • FGC: 老年代 GC 次数
    • FGCT: 老年代 GC 共占用时间
    • CGC: GC 过程中 Stop The World (STW) 次数
    • CGCT: GC 过程中 Stop The World (STW) 共占用时间
    • GCT: GC 共占用时间
    • LGCC: 上次 GC 原因
    • GCC: 当前 GC 原因

jstat -gccause pid

➜  ~ jstat -gccause 1290
  S0     S1      E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT        LGCC              GCC                 
  0.00 100.00  49.68   0.00  96.60  92.83      3    0.019    0    0.000     -        -    0.019 Metadata GC Threshold  No GC 
# -gcmetacapacity
  • 元空间容量统计
    • MCMN: 元空间最小内存容量
    • MCMX: 元空间最大内存容量
    • MC: 元空间内存容量
    • CCSMN: 压缩的类空间最小内存容量
    • CCSMX: 压缩的类空间最大内存容量
    • CCSC: 压缩的类空间内存容量
    • YGC: 年轻代 GC 次数
    • FGC: 老年代 GC 次数
    • FGCT: 老年代 GC 共占用时间
    • CGC: GC 过程中 Stop The World (STW) 次数
    • CGCT: GC 过程中 Stop The World (STW) 共占用时间
    • GCT: GC 共占用时间

jstat -gcmetacapacity pid

➜  ~ jstat -gcmetacapacity 1290
   MCMN       MCMX         MC     CCSMN  CCSMX       CCSC     YGC   FGC    FGCT    CGC    CGCT     GCT   
       0.0  1067008.0    21376.0   0.0  1048576.0   2944.0     3     0    0.000     -        -    0.019
# -gcnew
  • 年轻代统计
    • S0C: 年轻代第一个 Survivor (幸存者) 区内存容量
    • S1C: 年轻代第二个 Survivor (幸存者) 区内存容量
    • S0U: 年轻代第一个 Survivor (幸存者) 区已使用内存容量
    • S1U: 年轻代第二个 Survivor (幸存者) 区已使用内存容量
    • TT: 对象在新生代经过多少次 YGC 方可进入老年代
    • MTT: 对象在新生代最多经过多少次 YGC 方可进入老年代
    • DSS: 需要新生代 Survivor 区内存容量
    • EC: 年轻代 Eden 区内存容量
    • EU: 年轻代 Eden 区已使用内存容量
    • YGC: 年轻代 GC 次数
    • YGCT: 年轻代 GC 共占用时间

jstat -gcnew pid

➜  ~ jstat -gcnew 1290
 S0C  S1C     S0U  S1U    TT MTT  DSS      EC       EU     YGC   YGCT  
 0.0 12288.0  0.0 12288.0 15  15 20480.0 317440.0 157696.0  3    0.019
# -gcnewcapacity
  • 新生代空间容量统计信息
    • NGCMN: 新生代最小内存容量
    • NGCMX: 新生代最大内存容量
    • NGC: 当前新生代内存容量
    • S0CMX: 年轻代第一个 Survivor (幸存者) 区最大内存容量
    • S0C 当前年前代第一个 Survivor (幸存者) 区内存容量
    • S1CMX: 年轻代第二个 Survivor (幸存者) 区最大内存容量
    • S1C: 当前年前代第二个 Survivor (幸存者) 区内存容量
    • ECMX: 年轻代 Eden 区最大内存容量
    • EC: 当前年轻代 Eden 区内存容量
    • YGC: 年轻代 GC 次数
    • FGC: 老年代 GC 次数
    • CGC: GC 共占用时间

jstat -gcnewcapacity pid

➜  ~ jstat -gcnewcapacity 1290
  NGCMN  NGCMX       NGC      S0CMX     S0C  S1CMX       S1C      ECMX        EC      YGC   FGC   CGC 
  0.0  8388608.0   329728.0    0.0      0.0 8388608.0  12288.0  8388608.0   317440.0   3     0     -
# -gcold
  • 老年代和元空间 GC 统计
    • MC: 元空间内存容量
    • MU: 元空间已使用内存容量
    • CCSC: 压缩的类空间内存容量
    • CCSU: 压缩的类空间已使用内存容量
    • OC: 老年代内存容量
    • OU: 老年代已使用内存容量
    • YGC: 年轻代 GC 次数
    • FGC: 老年代 GC 次数
    • FGCT: 老年代 GC 共占用时间
    • CGC: GC 过程中 Stop The World (STW) 次数
    • CGCT: GC 过程中 Stop The World (STW) 共占用时间
    • CGC: GC 共占用时间

jstat -gcold pid

➜  ~ jstat -gcold 1290
   MC       MU      CCSC     CCSU       OC          OU      YGC   FGC   FGCT    CGC    CGCT     GCT   
 21376.0  20648.7   2944.0   2732.8    194560.0     0.0      3     0    0.000     -        -   0.019
# -gcoldcapacity
  • 老年代容量统计信息
    • OGCMN: 老年代最小内存容量
    • OGCMX: 老年代最大内存容量
    • OGC: 当前老年代新生成的内存容量
    • OC: 当前老年代内存容量
    • YGC: 年轻代 GC 次数
    • FGC: 老年代 GC 次数
    • FGCT: 老年代 GC 共占用时间
    • CGC: GC 过程中 Stop The World (STW) 次数
    • CGCT: GC 过程中 Stop The World (STW) 共占用时间
    • CGC: GC 共占用时间

jstat -gcoldcapacity pid

➜  ~ jstat -gcoldcapacity 1290
   OGCMN    OGCMX        OGC         OC       YGC   FGC    FGCT    CGC    CGCT    GCT   
    0.0   8388608.0    194560.0    194560.0    3     0    0.000     -       -    0.019
# -gcutil
  • GC 统计信息摘要
    • S0: 当前新生代第一个 Survivor (幸存者) 区内存利用率
    • S1: 当前新生代第二个 Survivor (幸存者) 区内存利用率
    • E: 当前新生代 Eden 区内存利用率
    • O: 当前老年代内存利用率
    • M: 当前元空间内存利用率
    • CCS: 压缩的类空间内存利用率
    • YGC: 年轻代 GC 次数
    • YGCT: 年轻代 GC 共占用时间
    • FGC: 老年代 GC 次数
    • FGCT: 老年代 GC 共占用时间
    • CGC: GC 过程中 Stop The World (STW) 次数
    • CGCT: GC 过程中 Stop The World (STW) 共占用时间
    • GCT: GC 共占用时间

jstat -gcutil pid

➜  ~ jstat -gcutil 1290
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT    GCT   
  0.00 100.00  49.68   0.00  96.60  92.83      3    0.019     0    0.000   -       -    0.019
# -printcompilation
  • 编译方法统计信息
    • Compiled: 最近编译的方法执行的编译任务数
    • Size: 最近编译的方法的字节数
    • Type: 最新编译方法的变异类型
    • Method: 最近编译的方法

jstat -printcompilation pid

➜  ~ jstat -printcompilation 1290
Compiled  Size  Type  Method
    2505    8    1 java/lang/Thread interrupted

# 常用方式

jstat -gc -t h3 1290 1000 7 // 查看pid: 1810的gc情况(每输出三次后就输出一次标题, 间隔一秒, 输出7次, 打印时间戳)

# jmap

  • 显示对应 Java 进程共享对象内存映射和堆内存详细信息

jmap -h

➜  ~ jmap -h
Usage:
    jmap -clstats <pid>
        to connect to running process and print class loader statistics
    jmap -finalizerinfo <pid>
        to connect to running process and print information on objects awaiting finalization
    jmap -histo[:[<histo-options>]] <pid>
        to connect to running process and print histogram of java object heap
    jmap -dump:<dump-options> <pid>
        to connect to running process and dump java heap
    jmap -? -h --help
        to print this help message

    dump-options:
      live         dump only live objects
      all          dump all objects in the heap (default if one of "live" or "all" is not specified
      format=b     binary format
      file=<file>  dump heap to <file>

    Example: jmap -dump:live,format=b,file=heap.bin <pid>

    histo-options:
      live         count only live objects
      all          count all objects in the heap (default if one of "live" or "all" is not specified)
      file=<file>  dump data to <file>

    Example: jmap -histo:live,file=/tmp/histo.data <pid>

# -clstats

  • 类加载器统计信息 (要在启动 JVM 加上 "-XX:+UnlockDiagnosticVMOptions", 否则提示 "GC.class_stats command requires -XX:+UnlockDiagnosticVMOptions")

jmap -clstats pid


# -finalizerinfo

  • 正在等待完成 Object#finalize 的对象信息

jmap -finalizerinfo pid


# -histo

  • 对象加载信息
    • instances: 实例化数量
    • bytes: 占用内存大小
    • class name: 类名

jmap -histo pid // 所有对象 (活 + 死) = jmap -histo:all pid
jmap -histo:live pid // 仅活着的对象

➜  ~ jmap -histo 1290

 num     #instances         #bytes  class name
----------------------------------------------
   1:        262756       75412928  [B
   2:        353892       47856944  [C
   3:         26663       24495960  [I
   4:        152534        3660816  java.lang.String
   5:         33405        2358368  [Ljava.lang.Object;
   6:         79417        1628576  [Ljava.lang.Class;
   7:         11905        1047640  java.lang.reflect.Method
   8:         19772         949056  java.util.HashMap
   9:         11167         861720  [S
  10:         33499         803976  java.lang.StringBuilder
  11:          7183         795192  java.lang.Class
  12:          7228         652808  [Ljava.util.HashMap$Node;
  13:         19622         627904  java.util.HashMap$Node
  14:         10910         610960  jdk.internal.org.objectweb.asm.Item
  15:         14520         464640  java.util.concurrent.ConcurrentHashMap$Node
...
3624:             1             16  sun.util.resources.LocaleData
3625:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total       1418529      175098616

# -heap

  • 堆配置,GC 摘要信息

jmap -heap pid

➜  ~ jhsdb jmap --heap --pid 1290
Attaching to process ID 1290, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 13.0.1+9

using thread-local object allocation.
Garbage-First (G1) GC with 10 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 8589934592 (8192.0MB)
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 5152702464 (4914.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 2097152 (2.0MB)

Heap Usage:
G1 Heap:
   regions  = 4096
   capacity = 8589934592 (8192.0MB)
   used     = 26590224 (25.358413696289062MB)
   free     = 8563344368 (8166.641586303711MB)
   0.3095509484410286% used
G1 Young Generation:
Eden Space:
   regions  = 6
   capacity = 31457280 (30.0MB)
   used     = 12582912 (12.0MB)
   free     = 18874368 (18.0MB)
   40.0% used
Survivor Space:
   regions  = 1
   capacity = 4194304 (4.0MB)
   used     = 4002832 (3.8173980712890625MB)
   free     = 191472 (0.1826019287109375MB)
   95.43495178222656% used
G1 Old Generation:
   regions  = 7
   capacity = 27262976 (26.0MB)
   used     = 10004480 (9.541015625MB)
   free     = 17258496 (16.458984375MB)
   36.69621394230769% used

# -dump

  • 导出对快照信息

jmap -dump:all,format=b,file=/Users/xxx/yyy.hprof pid // 导出统计堆中所有对象格式化快照
jmap -dump:live,format=b,file/Users/xxx/yyy.hprof pid // 导出统计堆中存活对象格式化快照

➜  ~ jmap -dump:live,format=b,file=/Users/smile/gc-gen-live-format.hprof  1290
Heap dump file created

# 常用方式

jmap -histo:live <pid>
jmap -heap <pid>
jmap -dump:live,format=b,file/Users/xxx/yyy.hprof <pid>

# jstack

  • 显示对应 Java 进程堆栈信息

jstack -h

➜  ~ jstack -h
Usage:
    jstack [-l][-e] <pid>
        (to connect to running process)

Options:
    -l  long listing. Prints additional information about locks
    -e  extended listing. Prints additional information about threads
    -? -h --help -help to print this help message

# -l

  • 长列表信息 (包含锁的附加信息,建议少使用,停顿时间会较长)

jstack -l pid

➜  ~ jstack -l 1290

2020-02-23 11:59:40
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode):

"DestroyJavaVM" #8175 prio=5 os_prio=31 tid=0x00007f84b1801000 nid=0xe03 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Thread-8151" #8173 prio=5 os_prio=31 tid=0x00007f84b1db0800 nid=0x3f6403 waiting on condition [0x0000700215a93000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
	at com.smile.SmileCompanyApplication.lambda$main$0(SmileCompanyApplication.java:22)
	at com.smile.SmileCompanyApplication$$Lambda$446/62309924.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
	- None

"RMI Scheduler(0)" #18 daemon prio=5 os_prio=31 tid=0x00007f84b219a000 nid=0x6c03 waiting on condition [0x0000700012a20000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000005ceb3c5c8> (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:1074)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
	- None 

"G1 Main Concurrent Mark GC Thread" os_prio=31 tid=0x00007f84b380f800 nid=0x4603 runnable 

"Gang worker#0 (G1 Parallel Marking Threads)" os_prio=31 tid=0x00007f84b3810800 nid=0x4103 runnable 

"Gang worker#1 (G1 Parallel Marking Threads)" os_prio=31 tid=0x00007f84b3811000 nid=0x4403 runnable 

"Gang worker#2 (G1 Parallel Marking Threads)" os_prio=31 tid=0x00007f84b3811800 nid=0x4203 runnable 

"VM Periodic Task Thread" os_prio=31 tid=0x00007f84b2864800 nid=0x9803 waiting on condition 

JNI global references: 1036

# -F

  • 当线程挂起时 (-l 都不起作用时), 强制打印堆栈信息

jstack -F pid

➜  ~ jstack -F 1290

Attaching to process ID 1290, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.211-b12
Deadlock Detection:

No deadlocks found.

Thread 13255: (state = BLOCKED)
 - sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
 - java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=175 (Compiled frame)
 - java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.util.concurrent.SynchronousQueue$TransferStack$SNode, boolean, long) @bci=144, line=458 (Compiled frame)
 - java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.lang.Object, boolean, long) @bci=102, line=362 (Compiled frame)
 - java.util.concurrent.SynchronousQueue.take() @bci=7, line=924 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor.getTask() @bci=149, line=1074 (Compiled frame)
 - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26, line=1134 (Compiled frame)
 - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=624 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)

Thread 13055: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - org.apache.felix.framework.util.ThreadGate.await(long) @bci=17, line=79 (Interpreted frame)
 - org.apache.felix.framework.Felix.waitForStop(long) @bci=31, line=1073 (Interpreted frame)
 - org.apache.karaf.main.Main.awaitShutdown() @bci=13, line=586 (Interpreted frame)
 - org.sonatype.nexus.karaf.NexusMain.main(java.lang.String[]) @bci=69, line=60 (Interpreted frame)
 - sun.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) @bci=0 (Interpreted frame)
 - sun.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=100, line=62 (Interpreted frame)
 - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=43 (Interpreted frame)
 - java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) @bci=56, line=498 (Interpreted frame)
 - com.exe4j.runtime.LauncherEngine.launch(java.lang.String, java.lang.String[], java.lang.String, java.lang.String, boolean, boolean, java.lang.ClassLoader) @bci=186, line=62 (Interpreted frame)
 - com.install4j.runtime.launcher.UnixLauncher.main(java.lang.String[]) @bci=208, line=60 (Interpreted frame)

# -m

  • Java 调用 C/C++ 的堆栈信息

jstack -m pid

➜  ~ jstack -m 1290

Attaching to process ID 13054, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.211-b12
Deadlock Detection:

No deadlocks found.

----------------- 13055 -----------------
0x00007f75373e9965	__pthread_cond_wait + 0xc5
0x00007f75365062d5	_ZN13ObjectMonitor4waitElbP6Thread + 0x525
0x00007f75362ff9b8	JVM_MonitorWait + 0x98
0x00007f75210183a7	* java.lang.Object.wait(long) bci:0 (Interpreted frame)
0x00007f7521007ffd	* org.apache.felix.framework.util.ThreadGate.await(long) bci:17 line:79 (Interpreted frame)
0x00007f75210077d0	* org.apache.felix.framework.Felix.waitForStop(long) bci:31 line:1073 (Interpreted frame)
0x00007f7521007e54	* org.apache.karaf.main.Main.awaitShutdown() bci:13 line:586 (Interpreted frame)
0x00007f7521007ffd	* org.sonatype.nexus.karaf.NexusMain.main(java.lang.String[]) bci:69 line:60 (Interpreted frame)
0x00007f75210004e7	<StubRoutines>
0x00007f753629442b	_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread + 0xddb
0x00007f75365a5e55	_ZN10Reflection6invokeE19instanceKlassHandle12methodHandle6Handleb14objArrayHandle9BasicTypeS3_bP6Thread + 0xb65
0x00007f75365a7796	_ZN10Reflection13invoke_methodEP7oopDesc6Handle14objArrayHandleP6Thread + 0x126
0x00007f7536309472	JVM_InvokeMethod + 0x102
0x00007f75210183a7	* sun.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) bci:0 (Interpreted frame)
0x00007f7521007d80	* sun.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) bci:100 line:62 (Interpreted frame)
0x00007f7521007d80	* sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) bci:6 line:43 (Interpreted frame)
0x00007f7521007e54	* java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) bci:56 line:498 (Interpreted frame)
0x00007f7521007d80	* com.exe4j.runtime.LauncherEngine.launch(java.lang.String, java.lang.String[], java.lang.String, java.lang.String, boolean, boolean, java.lang.ClassLoader) bci:186 line:62 (Interpreted frame)
0x00007f7521007ffd	* com.install4j.runtime.launcher.UnixLauncher.main(java.lang.String[]) bci:208 line:60 (Interpreted frame)
0x00007f75210004e7	<StubRoutines>
0x00007f753629442b	_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread + 0xddb
0x00007f75362df3e1	_ZL17jni_invoke_staticP7JNIEnv_P9JavaValueP8_jobject11JNICallTypeP10_jmethodIDP18JNI_ArgumentPusherP6Thread.isra.96.constprop.117 + 0x1e1
0x00007f75362e16ab	jni_CallStaticVoidMethod + 0x15b
0x00007f75371ce89c	JavaMain + 0xa3c
----------------- 13056 -----------------
0x00007f75373e9d12	__pthread_cond_timedwait + 0x132
0x00007f75364d7614	_ZN7Monitor5IWaitEP6Threadl + 0x1d4
0x00007f75364d8a8a	_ZN7Monitor4waitEblb + 0x22a
0x00007f75366e4922	_ZN8VMThread4loopEv + 0x1e2
0x00007f75366e4eb8	_ZN8VMThread3runEv + 0x78
0x00007f7536519952	_ZL10java_startP6Thread + 0x102
----------------- 13255 -----------------
0x00007f75373e9965	__pthread_cond_wait + 0xc5
0x00007f75366b047b	Unsafe_Park + 0x9b
0x00007f7521ed356a	<Unknown compiled code>
0x00007f7522d1351b	* java.util.concurrent.locks.LockSupport.park(java.lang.Object) bci:14 line:175 (Compiled frame)
* java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.util.concurrent.SynchronousQueue$TransferStack$SNode, boolean, long) bci:144 line:458 (Compiled frame)
* java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.lang.Object, boolean, long) bci:102 line:362 (Compiled frame)
* java.util.concurrent.SynchronousQueue.take() bci:7 line:924 (Interpreted frame)
----------------- 13325 -----------------
0x00007f75373e9965	__pthread_cond_wait + 0xc5
0x00007f75366b047b	Unsafe_Park + 0x9b
0x00007f7521ed356a	<Unknown compiled code>
0x00007f7522d1351b	* java.util.concurrent.locks.LockSupport.park(java.lang.Object) bci:14 line:175 (Compiled frame)
* java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.util.concurrent.SynchronousQueue$TransferStack$SNode, boolean, long) bci:144 line:458 (Compiled frame)
* java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.lang.Object, boolean, long) bci:102 line:362 (Compiled frame)
* java.util.concurrent.SynchronousQueue.take() bci:7 line:924 (Interpreted frame)
----------------- 13054 -----------------
0x00007f75373e6f47	pthread_join + 0xa7

# 常用方式

jstack <pid> > /Users/xxx/stack.log

# 引用

  • Java8 - 官方文档
Edited on Views times