java优化系列一 JVM优化 几个命令

jps(Java Virtual Machine Process Status Tool)

查看当前java进程情况 及 pid,相似与linux里的ps命令
参数
  • -q 只显示pid 不显示class和jar名称和传递给main的参数
xir ~$ jps -q
47056
46243
46227
46186
  • -m 输出传递给main方法的参数,在嵌入式jvm上可能是null
xBook-Air ~$ jps -m
46243 Launcher /Applications/IntelliJ IDEA.app/Contents/lib/asm-all-7.0.1.jar:/Applications/IntelliJ IDEA.app/Contents/lib/lz4-java-1.6.0.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/maven-aether-provider-3.3.9.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/aether-connector-basic-1.1.0.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/plexus-utils-3.0.22.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/aether-api-1.1.0.jar:/Applications/IntelliJ IDEA.app/Contents/lib/httpclient-4.5.9.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/maven-model-builder-3.3.9.jar:/Applications/IntelliJ IDEA.app/Contents/lib/netty-codec-4.1.38.Final.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/maven-builder-support-3.3.9.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/jps-builders-6.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/javac2.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/li
46227 DemoApplication
46186 
47100 Jps -m
  • -l 输出 main、class 完成的包名或 应用程序jar完成路径
eMacBook-Air ~$ jps -l
46243 org.jetbrains.jps.cmdline.Launcher
46227 com.example.demo.DemoApplication
47076 jdk.jcmd/sun.tools.jps.Jps
46186 
  • -v 输出传递给jvm的参数
xiaAir ~$ jps -v
46737 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home -Xms8m -Djdk.module.main=jdk.jcmd
46243 Launcher -Xmx700m -Djava.awt.headless=true -Djdt.compiler.useSingleThread=true -Dpreload.project.path=/Users/xiaochai/java/demo -Dpreload.config.path=/Users/22/Library/Preferences/IntelliJIdea2019.2/options -Dexternal.project.config=/Users/22/Library/Caches/IntelliJIdea2019.2/external_build_system/demo.4ba6d4c3 -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-7511366293896763489 -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.country=CN -Didea.paths.selector=IntelliJIdea2019.2 -Didea.home.path=/Applications/IntelliJ IDEA.app/Contents -Didea.config.path=/Users/xiaochai/Library/Preferences/IntelliJIdea2019.2 -Didea.plugins.path=/Users/22/Library/Application Support/IntelliJIdea2019.2 -Djps.log.dir=/Users/22/Library/Logs/IntelliJIdea2019.2/build-log -Djps.fallback.jdk.home=/Applications/IntelliJ IDEA.app/Contents/jbr/Contents/Home -Djps.fallback.jdk.version=11.0.3 -Dio.netty.noUnsafe=true -Djava.io.tmpdir=/Users/xiaochai
46227 DemoApplication -XX:TieredStopAtLevel=1 -Xverify:none -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=56610:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8
46186  -Xms128m -Xmx1024m -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 -Xverify:none -XX:ErrorFile=/Users/22/java_error_in_idea_%p.log -XX:HeapDumpPath=/Users/22/java_error_in_idea.hprof -javaagent:/Users/22/Documents/jetbrains-agent/jetbrains-agent.jar -Djb.vmOptionsFile=/Users/xiaochai/Library/Preferences/IntelliJIdea2019.2/idea.vmoptions -Didea.home.path=/Applications/IntelliJ IDEA.app/Contents -Didea.executable=idea -Didea.paths.selector=IntelliJIdea2019.2

  • 查看其它机器 jps -mlv IP

jinfo

使用–help 查看

xiaochai@xiaochaideMacBook-Air ~$ jinfo --help
Usage:
    jinfo <option> <pid> 对应jvm进程id
       (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

no option

命令:jinfo pid
描述:输出当前 jvm 进程的全部参数和系统属性
java优化系列一 JVM优化 几个命令_第1张图片

-flag name

命令:jinfo -flag name pid
描述:输出对应名称的参数
使用该命令,可以查看指定的 jvm 参数的值。如:查看当前 jvm 进程是否开启打印 GC 日志。

xiaochai@xiaochaideMacBook-Air ~$ jinfo -flag PrintGC 46227
-XX:-PrintGC

示例三:-flag [+|-]name

-flags

命令:jinfo -flags pid
描述:输出全部的参数

xiaochai@xiaochaideMacBook-Air ~$ jinfo -flags 67066
67066: No such process
xiaochai@xiaochaideMacBook-Air ~$ jinfo -flags 57066
VM Flags:
-XX:CICompilerCount=3 -XX:ConcGCThreads=1 -XX:G1ConcRefinementThreads=4 -XX:G1HeapRegionSize=1048576 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=134217728 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=734003200 -XX:MaxNewSize=440401920 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5830732 -XX:NonProfiledCodeHeapSize=122913754 -XX:ProfiledCodeHeapSize=122913754 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 

-sysprops

命令:jinfo -sysprops pid
描述:输出当前 jvm 进行的全部的系统属性

xiaochai@xiaochaideMacBook-Air ~$ jinfo -sysprops 57066
Java System Properties:
#Fri Jun 26 03:24:35 CST 2020
awt.toolkit=sun.lwawt.macosx.LWCToolkit
java.specification.version=12
sun.jnu.encoding=UTF-8
java.class.path=/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/jps-launcher.jar\:/Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home/lib/tools.jar
java.vm.vendor=Oracle Corporation
jdt.compiler.useSingleThread=true
sun.arch.data.model=64
kotlin.incremental.compilation=true
kotlin.daemon.client.alive.path="/var/folders/mv/kn2dvc3x1rb6hx3qc1tz3s5m0000gn/T/kotlin-idea-7691781754153802143-is-running"
java.vendor.url=https\://java.oracle.com/
user.timezone=Asia/Shanghai
idea.plugins.path=/Users/xiaochai/Library/Application Support/IntelliJIdea2019.2
java.vm.specification.version=12
kotlin.incremental.compilation.js=true
os.name=Mac OS X
user.country=CN
sun.java.launcher=SUN_STANDARD
-Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,
			JVM就会增大堆直到-Xmx的最大限制
-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,
			JVM会减少堆直到 -Xms的最小限制
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。
			与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。
			在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。
			两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
-Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。
			应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。
			但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
			一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。
			这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,
			官方文档似乎没有解释,在论坛中有这样一句话:
			"-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。
-XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。

jmap 命令

命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
用法

xiaochai@xiaochaideMacBook-Air ~$ jmap --help
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[:live] <pid>
        to connect to running process and print histogram of java object heap
        if the "live" suboption is specified, only count live objects
    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; 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>
  • no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
  • heap: 显示Java堆详细信息
  • histo[:live]: 显示堆中对象的统计信息
  • clstats:打印类加载器信息
  • finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • dump::生成堆转储快照
  • F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
  • help:打印帮助信息
  • J:指定传递给运行jmap的JVM的参数

-clstats

命令:jmap -clstats pid
描述:打印类加载器信息

-clstats是-permstat的替代方案,在JDK8之前,-permstat用来打印类加载器的数据
打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

xiaochai@xiaochaideMacBook-Air ~$ jmap -clstats 57459 | grep Demo
 1638  3581        32        576           0     2296          10       271      1760     1384     3712     5096 com.example.demo.DemoApplication$$EnhancerBySpringCGLIB$$5357a3d2
 3581    15         0        528          48      440           2        13       352      288     1216     1504 com.example.demo.DemoApplication
 

示例三:histo[:live]

命令:jmap -histo:live pid
描述:显示堆中对象的统计信息

其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。

xiaochai@xiaochaideMacBook-Air ~$ jmap -histo:live 57459
 num     #instances         #bytes  class name (module)
-------------------------------------------------------
   1:         54981        5293336  [B ([email protected])
   2:         52586        1262064  java.lang.String ([email protected])
   3:         11907        1047816  java.lang.reflect.Method ([email protected])
   4:          8036         952352  java.lang.Class ([email protected])
   5:         22530         720960  java.util.concurrent.ConcurrentHashMap$Node ([email protected])
   6:          8342         485144  [Ljava.lang.Object; ([email protected])
   7:         11715         468600  java.util.LinkedHashMap$Entry ([email protected])
   8:          5561         432784  [Ljava.util.HashMap$Node; ([email protected])
   9:          3186         414808  [I ([email protected])
  10:         12142         388544  java.util.HashMap$Node ([email protected])
  11:          6150         344400  java.util.LinkedHashMap ([email protected])
  12:         14547         327560  [Ljava.lang.Class; ([email protected])
  13:           368         223232  [Ljava.util.concurrent.ConcurrentHashMap$Node; ([email protected])
  14:          2365         170280  java.lang.reflect.Field ([email protected])
  15:         10583         169328  java.lang.Object ([email protected])
  16:          1345         107600  java.lang.reflect.Constructor ([email protected])
  17:          2576         103040  java.lang.ref.SoftReference ([email protected])
  18:          1587         101568  java.lang.Class$ReflectionData ([email protected])
  19:           134          93528  [C ([email protected])

dump:

命令:jmap -dump:format=b,file=heapdump.phrof pid
描述:生成堆转储快照dump文件。

以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,
并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。

finalizerinfo

命令:jmap -finalizerinfo pid
描述:打印等待终结的对象信息

xiaochai@xiaochaideMacBook-Air ~$ jmap -finalizerinfo 57459
No instances waiting for finalization found

https://www.jianshu.com/p/8d8aef212b25
https://www.jianshu.com/p/a4ad53179df3
https://blog.csdn.net/yx0628/article/details/80958488

你可能感兴趣的:(java优化系列一 JVM优化 几个命令)