记一次JVM常用的指令(one)

                                    那人却在灯火阑珊处

题记 : 最近把同事的书 : 深入理解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 参数来强制执行命令

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章