jvm调优-命令行篇

常用命令有: jps jstat jstack jmap jinfo

jps

JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。

命令格式: jps [options] [hostid]
  说明:[] :可省略    |: 多选一
      <>:必选参数    …:可多次出现
option参数:
-l : 输出主类全名或jar路径
-q : 只输出LVMID
-m : 输出JVM启动时传递给main()的参数
-v : 输出JVM启动时显示指定的JVM参数

常用示例:

[root@VM-4-13-centos ~]# jps -l
13540 0520ERP-0.0.1-SNAPSHOT.jar

jstat

jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

命令格式: jstat [option] LVMID [interval] [count]
说明:
[option] : 操作参数
LVMID : 本地虚拟机进程ID
[interval] : 连续输出的时间间隔
[count] : 连续输出的次数

常用示例:

# 每一秒打印一次垃圾回收堆的行为统计,一共打印20次
[root@VM-4-13-centos ~]# jstat -gc 13540 1000 20
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
13824.0 512.0   0.0    0.0   258048.0  7488.6   137728.0   37204.2   80000.0 76238.7 9600.0 8940.8     23    0.233   5      0.604    0.837
13824.0 512.0   0.0    0.0   258048.0  7488.6   137728.0   37204.2   80000.0 76238.7 9600.0 8940.8     23    0.233   5      0.604    0.837
13824.0 512.0   0.0    0.0   258048.0  7488.6   137728.0   37204.2   80000.0 76238.7 9600.0 8940.8     23    0.233   5      0.604    0.837

S0C : survivor0区的总容量
S1C : survivor1区的总容量
S0U : survivor0区已使用的容量
S1C : survivor1区已使用的容量
EC : Eden区的总容量
EU : Eden区已使用的容量
OC : Old区的总容量
OU : Old区已使用的容量
PC 当前perm的容量 (KB)
PU perm的使用 (KB)
YGC : 新生代垃圾回收次数
YGCT : 新生代垃圾回收时间
FGC : 老年代垃圾回收次数
FGCT : 老年代垃圾回收时间
GCT : 垃圾回收总消耗时间

jmap

jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。 jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。

命令格式: jmap [option] LVMID
option参数:
dump : 生成堆转储快照
finalizer方法的对象
heap : 显示Java堆详细信息
histo : 显示堆中对象的统计信息
F : 当-dump没有响应时,强制生成dump快照

常用示例:

#以二进制形式将堆转储到指定文件
[root@VM-4-13-centos ~]# jmap -dump:format=b,file=20220101.hprof 13540
Dumping heap to /root/20220101.hprof ...
Heap dump file created

# -dump:live,format=b,file=<filename> pid 
[root@VM-4-13-centos ~]# jmap -dump:live,format=b,file=20220101.hprof 13540
Dumping heap to /root/20220101.hprof ...
File exists

jhat

jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。

命令格式: jhat [dumpfile]

常用示例:

[root@VM-4-13-centos ~]# jhat 20200101.hprof 
Reading from 20200101.hprof...
Dump file created Sat May 21 13:34:20 CST 2022
Snapshot read, resolving...
Resolving 665983 objects...
Chasing references, expect 133 dots.....................................................................................................................................
Eliminating duplicate references.....................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

jstack

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。

命令格式: jstack [option] LVMID
option参数:
-F : 当正常输出请求不被响应时,强制输出线程堆栈
-l : 除堆栈外,显示关于锁的附加信息
-m : 如果调用到本地方法的话,可以显示C/C++的堆栈

常用示例:

[root@VM-4-13-centos ~]# jstack 13540
2022-05-21 14:22:32
Full thread dump OpenJDK 64-Bit Server VM (25.322-b06 mixed mode):

"arthas-command-execute" #46 daemon prio=5 os_prio=0 tid=0x00007f20bc03f000 nid=0x4532 waiting on condition [0x00007f208eefe000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000c65e1a98> (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:750)

jinfo

jinfo(JVM Configuration info)这个命令作用是实时查看和调整虚拟机运行参数。 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令

命令格式: jinfo [option] [args] LVMID
option参数:
-flag : 输出指定args参数的值
-flags : 不需要args参数,输出所有JVM参数的值
-sysprops : 输出系统属性,等同于System.getProperties()

常用示例:

# 查看某个数值型参数
C:\Users\lhw> jinfo -flag  PretenureSizeThreshold 33596
-XX:PretenureSizeThreshold=0

# 运行时,PretenureSizeThreshold参数不能被修改运行时能修改的参数很少()
C:\Users\lhw> jinfo -flag  -XX:PretenureSizeThreshold=800M 33596
Exception in thread "main" com.sun.tools.attach.AttachOperationFailedException: flag '-XX:PretenureSizeThreshold' cannot be changed

        at sun.tools.attach.WindowsVirtualMachine.execute(WindowsVirtualMachine.java:117)
        at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:261)
        at sun.tools.attach.HotSpotVirtualMachine.setFlag(HotSpotVirtualMachine.java:234)
        at sun.tools.jinfo.JInfo.flag(JInfo.java:134)
        at sun.tools.jinfo.JInfo.main(JInfo.java:81)

附:GC常用参数

  • -Xmn -Xms -Xmx -Xss
    -年轻代 最小堆 最大堆 栈空间
  • -XX:+UseTLAB 使用TLAB,默认打开
  • -XX:+PrintTLAB 打印TLAB的使用情况
  • -XX:TLABSize 设置TLAB大小
  • -XX:+DisableExplictGC System.gc()不管用 ,FGC
  • -XX:+PrintGC
    -XX:+PrintGCDetails 垃圾回收时打印详细的日志
    -XX:+PrintHeapAtGC 每一次GC前后都打印堆信息
    -XX:+PrintGCTimeStamps 输出GC发生的时间戳
  • -XX:+PrintGCApplicationConcurrentTime (低) 打印应用程序时间
    -XX:+PrintGCApplicationStoppedTime (低) 打印暂停时长
  • -verbose:class 类加载详细过程
  • -XX:+PrintVMOptions
  • -XX:+PrintFlagsFinal 手动修改以后的JVM配置
  • -XX:+PrintFlagsInitial JVM 出厂默认值
  • -Xloggc:opt/log/gc.log
  • -XX:MaxTenuringThreshold 升代年龄,最大值15
  • 锁自旋次数 -XX:PreBlockSpin 热点代码检测参数-XX:CompileThreshold 逃逸分析 标量替换 …
    这些不建议设置

Parallel常用参数

  • -XX:SurvivorRatio
  • -XX:PreTenureSizeThreshold 大对象到底多大
  • -XX:MaxTenuringThreshold 默认值为15
  • -XX:+ParallelGCThreads 并行收集器的线程数,同样适用于CMS,一般设为和CPU核数相同
  • -XX:+UseAdaptiveSizePolicy 自动选择各区大小比例

CMS常用参数

  • -XX:+UseConcMarkSweepGC
  • -XX:ParallelCMSThreads CMS线程数量
  • -XX:CMSInitiatingOccupancyFraction 使用多少比例的老年代后开始CMS收集,默认是68%(近似值),如果频繁发生SerialOld卡顿,应该调小,(频繁CMS回收)
  • -XX:+UseCMSCompactAtFullCollection 在FGC时进行压缩
  • -XX:CMSFullGCsBeforeCompaction 多少次FGC之后进行压缩
  • -XX:+CMSClassUnloadingEnabled
  • -XX:CMSInitiatingPermOccupancyFraction 达到什么比例时进行Perm回收
  • GCTimeRatio 设置GC时间占用程序运行时间的百分比
  • -XX:MaxGCPauseMillis 停顿时间,是一个建议时间,GC会尝试用各种手段达到这个时间,比如减小年轻代
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值