那人却在灯火阑珊处
题记 : 最近把同事的书 : 深入理解Java虚拟机(第二版,周志明);然后结合网上一些博客的说明,似懂非懂,有些地方还是要深入,目前还没看完,看下有望在这个月内看完.
好啦,废话少说,进入到主题来进行记录.
在线上环境是不存在用户界面的只有命令行界面,所以我们使用JMX在使用类似jconsole、jvisualvm(包括插件)这样的界面化程序进行调试实不可取的,只能使用多种命令结合的方式进行。
常用指令介绍 :
1 jps
jps命令主要用于查看有权访问的hotspot虚拟机下工作的java进程(默认为本操作系统),以及进程编号。使用方式如下:
usage jps [-help]
jps [-q] [-mlvV][<hostid>]
比如:
3248 Jps
26327 Launcher
18632 RemoteMavenServer
4825 Main
jps可以使用的参数包括:
-q :仅仅显示VM 标示,不显示jar,class, main参数等信息.
m:输出当运行java进程主方法时,操作者传入的参数.
l: 输出应用程序主类完整package名称或jar完整名称。实例如下:
jps -l
26327 org.jetbrains.jps.cmdline.Launcher
18632 org.jetbrains.idea.maven.server.RemoteMavenServer
4825 com.intellij.idea.Main
3851 sun.tools.jps.Jps
jps -v 列出Jvm参数
3937 Jps -Dapplication.home=/usr/lib/jvm/jdk1.8.0_211 -Xms8m
26327 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=/home/adetam/Desktop/vue_self_gavin/thread-learn-case -Dpreload.config.path=/home/adetam/.IntelliJIdea2019.1/config/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-3670669770720620027 -Dfile.encoding=UTF-8 -Duser.language=en -Duser.country=US -Didea.paths.selector=IntelliJIdea2019.1 -Didea.home.path=/opt/idea-IU-191.7479.19 -Didea.config.path=/home/adetam/.IntelliJIdea2019.1/config -Didea.plugins.path=/home/adetam/.IntelliJIdea2019.1/config/plugins -Djps.log.dir=/home/adetam/.IntelliJIdea2019.1/system/log/build-log -Djps.fallback.jdk.home=/opt/idea-IU-191.7479.19/jre64 -Djps.fallback.jdk.version=1.8.0_202-release -Dio.netty.noUnsafe=true -Djava.io.tmpdir=/home/adetam/.IntelliJIdea2019.1/system/compile-server/thread-learn-case_7a24a3cd/_temp_ -Djps.backward.ref.index.builder=true -Dkotlin.incremental.compilati
18632 RemoteMavenServer -Djava.awt.headless=true -Didea.version==2019.1.3 -Xmx768m -Didea.maven.embedder.version=3.6.1 -Dfile.encoding=UTF-8
4825 Main -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Dawt.useSystemAAFontSettings=lcd -Dsun.java2d.renderer=sun.java2d.marlin.MarlinRenderingEngine -Dsun.tools.attach.tmp.only=true -javaagent:/home/adetam/Desktop/doc_self/jar/jetbrains-agent.jar -XX:ErrorFile=/home/adetam/java_error_in_IDEA_%p.log -XX:HeapDumpPath=/home/adetam/java_error_in_IDEA.hprof -Didea.paths.selector=IntelliJIdea2019.1 -Djb.vmOptionsFile=/home/adetam/.IntelliJIdea2019.1/config/idea64.vmoptions -Didea.jre.check=true
2 : jinfo
jinfo命令可以用来查看正在运行的java进程的运行参数和环境参数;在一些特定情况下,还可以在运行时修改部分参数。使用格式如下:
Usage:
jinfo [option] <pid>
(to connect to running process)
jinfo [option] <executable <core>
(to connect to a core file)
jinfo [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)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 of the above
-h | -help to print this help message
jinfo 带上jps中的数字就可以看到参数设置:一种是系统环境参数,宁外一种是JVM参数
flags 使用该命令参数,打印当前指定java进程中已经设定的所有JVM参数信息。使用方式类似如下
: jinfo flags 家加上java进程号(不要使用linux进程号,不然是看不到信息的)
: -flag <name> 如下 :
jinfo -flag MinHeapDeltaBytes 65646
-XX:MinHeapDeltaByte=524288
-sysprops : 使用该命令参数,打印当前java进程中设定的系统环境参数(在强调下:是java进程数字)
jinfo -sysprops 18632 下面是节省了一部分信息
Attaching to process ID 18632, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.144-b01 java.runtime.name = Java(TM) SE Runtime Environment java.vm.version = 25.144-b01
-flag [+|-] <name> :
通过该命令参数,可以更改标记类型为“manageable”,且设置值为“bool”型的参数值,使用示例如下:
jinfo -flag +PrintGC 18632
-flag <name>=<value>
通过该命令参数,可以为一些JVM参数设定新的值,使用示例如下:
3 : jmap 命令
jmap命令最大的作用是生成当前指定的Java进程的dump文件,这个dump文件有利于在正式生成环境下观察JVM运行的详细情况,这样才能着手找出可能的问题。jmap命令还可以查询finalize执行队列、Java堆的详细信息,例如查看新生代目前使用的是哪种收集器。
Usage :
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable> (core)
(to connect to a core file)
jmap [option] [server_id@] <remote server IP or hostname>
(to connect to remote debug server)
where <option> is one of: <none> to print same info as Solaris pmap -heap to print java heap summary -histo[:live] to print histogram of java object heap; if the "live" suboption is specified, only count live objects -clstats to print class loader statistics -finalizerinfo to print information on objects awaiting finalization -dump:<dump-options> to dump java heap in hprof binary format dump-options: live dump only live objects; if not specified, all objects in the heap are dumped. format=b binary format file=<file> dump heap to <file> Example: jmap -dump:live,format=b,file=heap.bin <pid> -F force. Use with -dump:<dump-options> <pid> or -histo to force a heap dump or histogram when <pid> does not respond. The "live" suboption is not supported in this mode. -h | -help to print this help message -J<flag> to pass <flag> directly to the runtime system
jmap可以使用如上“jmap [option] [server_id@]<remote server IP or hostname>”的命令格式监控远程服务器上的java进程信息,但是其最重要的还是option参数,我们首先介绍option参数的具体意义:
-<none> 这个意思是说,jmap可以不加任何option参数信息,只是指定Java进程的进程号。这种情况下,jmap命令将按照Linux操作系统进程内存分析命令pmap的相关性,输出内存分析结果。
-heap 改参数将输出当前指定java进程的堆内存概要信息。
-clstats 该参数将打印出当前java进程中,存在的每个类加载器,以及通过该类加载器已经完成加载的各类信息,包括但不限于类加载器的活动情况、已经加载的类数量、关联的父类加载器等等(class文件通过类加载器完成的载入、连接、验证初始化等过程可以在这个命令的输出详情中具体体现出来)。
finalizerinfo 该参数可打印出等待终结的对象信息,当Java进程在频繁进行Full GC的时候,可以通过该命令获取问题的排查依据。
-histo[:live] 该参数可以输出每个class的实例数目、内存占用、类全名等信息。如果live子参数加上后,只统计活的对象数量。该命令非常有用,举个例子,你可以使用该名了检查软件系统的某种设计模式是否符合设计预期。
-dump:<dump-options> 该参数代表了jmap最重要的功能,取得当前指定java进程堆内存中各个class实例的详细信息,并输出到指定文件。dump命令还有三个子参数分别是。live只分析输出目前有活动实例的class信息;format输出格式,默认为“b”,可以使用配套的分析软件进行分析;file子参数可以指定输出的文件,注意,如果输出文件已经存在,则可以使用-F 参数来强制执行命令