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 进程的全部参数和系统属性
在这里插入图片描述

-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 (java.base@12.0.2)
   2:         52586        1262064  java.lang.String (java.base@12.0.2)
   3:         11907        1047816  java.lang.reflect.Method (java.base@12.0.2)
   4:          8036         952352  java.lang.Class (java.base@12.0.2)
   5:         22530         720960  java.util.concurrent.ConcurrentHashMap$Node (java.base@12.0.2)
   6:          8342         485144  [Ljava.lang.Object; (java.base@12.0.2)
   7:         11715         468600  java.util.LinkedHashMap$Entry (java.base@12.0.2)
   8:          5561         432784  [Ljava.util.HashMap$Node; (java.base@12.0.2)
   9:          3186         414808  [I (java.base@12.0.2)
  10:         12142         388544  java.util.HashMap$Node (java.base@12.0.2)
  11:          6150         344400  java.util.LinkedHashMap (java.base@12.0.2)
  12:         14547         327560  [Ljava.lang.Class; (java.base@12.0.2)
  13:           368         223232  [Ljava.util.concurrent.ConcurrentHashMap$Node; (java.base@12.0.2)
  14:          2365         170280  java.lang.reflect.Field (java.base@12.0.2)
  15:         10583         169328  java.lang.Object (java.base@12.0.2)
  16:          1345         107600  java.lang.reflect.Constructor (java.base@12.0.2)
  17:          2576         103040  java.lang.ref.SoftReference (java.base@12.0.2)
  18:          1587         101568  java.lang.Class$ReflectionData (java.base@12.0.2)
  19:           134          93528  [C (java.base@12.0.2)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要查看JVM内存使用情况,可以使用以下命令: 1. jps命令:查看Java进程的进程ID 2. jstat命令:查看JVM内存使用情况,包括堆内存、非堆内存、GC情况等 3. jmap命令:生成JVM内存快照,可以用于分析内存泄漏等问题 4. jconsole命令:图形化界面查看JVM内存使用情况,包括堆内存、非堆内存、GC情况等 以上命令都可以在Linux系统下使用。 ### 回答2: 在Linux系统中查看JVM内存使用非常简单,只需要使用命令行工具即可。 首先,我们需要确认JDK已经安装在系统中。在终端中输入下面命令来检查Java版本: java -version 如果Java命令不存在,则需要安装JDK。在Ubuntu系统中,可以使用下面命令来安装OpenJDK: sudo apt-get install openjdk-8-jdk 安装完成后,我们可以在终端中运行下面命令来启动JVMjava -Xms256m -Xmx1024m -jar myapp.jar 该命令可以启动一个Java应用程序,并设置初始堆内存为256M,最大堆内存为1024M。当程序运行时,我们可以使用下面命令来查看JVM内存使用情况: jstat -gc <pid> <interval> <count> 其中,<pid>是JVM进程的进程号,<interval>是采样间隔(以毫秒为单位),<count>是采样次数。 例如,我们可以使用下面命令来查看JVM进程的进程号: ps aux | grep java 然后,使用进程号来查看JVM内存使用情况: jstat -gc <pid> 1000 10 该命令将每秒钟采样一次,共采样10次,然后输出JVM的堆内存使用情况和垃圾回收情况。 除了jstat命令外,我们还可以使用其他工具来查看JVM内存使用情况,例如jmap、jcmd、jstatd等。这些工具的用法和参数不同,请根据需要选择合适的工具。 总之,Linux下查看JVM内存使用情况非常方便,只需要用一些简单的命令就可以完成。这对于调试Java程序和优化JVM性能非常有帮助。 ### 回答3: 在Linux系统中,我们可以使用多种方式来查看Java虚拟机(JVM)内存的使用情况,下面介绍几种常用的方法: 1.使用jstat命令 jstat是Java Development Kit(JDK)中自带的一个监控JVM的工具,它能监控JVM内存的使用情况,包括整体内存使用、堆内存使用、非堆内存使用、永久代内存使用等。使用jstat命令,可以获取JVM内存的各项指标,并指导性能调优。以下是查看堆内存和非堆内存使用情况的命令: - 查看堆内存使用情况:jstat -gcutil [pid] [间隔时间] [查看次数] - 查看非堆内存使用情况:jstat -gc [pid] [间隔时间] [查看次数] 其中,[pid]是进程ID,[间隔时间]是每隔多少毫秒获取一次内存使用情况,[查看次数]是总共查看的次数。 2.使用jps和jmap命令 jps是JDK中的一个命令,用来列出JVM进程ID,也可以查看JVM进程的启动参数。jmap是JDK中的一个堆转储工具,可以生成JVM堆的转储快照,以及查询JVM内存使用情况。以下是查看JVM内存使用情况的命令: - 查看JVM进程ID:jps - 生成JVM堆快照:jmap -dump:file=[堆快照文件名] [pid] - 查询JVM内存使用情况:jmap -heap [pid] 其中,[pid]是进程ID。 3.使用top命令 top是系统资源监视器,可以通过top命令查看系统中所有进程的CPU、内存等资源使用情况。通过top命令可以查看JVM进程的CPU和内存使用情况。以下是查看JVM进程的内存使用情况的命令: - top -p [pid] 其中,[pid]是进程ID。 通过以上这些方式,我们可以了解JVM的内存使用情况,方便我们进行性能调优和资源管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值