JVM调优命令(下)

简介: JVM调优命令

七、jstack 50053 | more (必须掌握)


dbq@mac:~$ jstack 50053 | more
2021-02-27 15:32:08
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):
"pool-1-thread-71" #81 prio=5 os_prio=31 tid=0x00007fbd7313c800 nid=0x1a07 waiting on condition [0x00007000081fb000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007b9673f58> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)
        at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1076)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)
"Attach Listener" #80 daemon prio=9 os_prio=31 tid=0x00007fbd7287d000 nid=0x6c0b waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
"pool-1-thread-70" #79 prio=5 os_prio=31 tid=0x00007fbd7313c000 nid=0x6007 waiting on condition [0x0000700005983000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007b9673f58> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)
        at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1076)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)
"pool-1-thread-69" #78 prio=5 os_prio=31 tid=0x00007fbd71868800 nid=0x5807 waiting on condition [0x0000700005577000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007b9673f58> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)
        at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)


八、jmap


jmap -histo pid


显示对象的内存图


当我们的程序频繁GC时

Exception in thread "pool-1-thread-51" java.lang.OutOfMemoryError: GC overhead limit exceeded
[Full GC (Ergonomics)  159584K->159581K(182272K), 0.5506696 secs]
[Full GC (Ergonomics)  159584K->159581K(182272K), 0.5855513 secs]
[Full GC (Ergonomics)  159584K->159581K(182272K), 0.5552056 secs]
[Full GC (Ergonomics)  159584K->159581K(182272K), 0.5426389 secs]


可以通过这个命令查看哪些对象不被回收 (head:列出前20行)


可以多次运行该命令观察某对象是否持续增大,说明该对象不断在产生,不被回收

dbq@mac:~$ jmap -histo 52272 | head -20
         对象数              占用内存字节数
 num     #instances         #bytes  class name
----------------------------------------------
   1:        638662       20437184  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
   2:        283400       20404800  java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
   3:        283426       11337040  java.math.BigDecimal
   4:        283400        9068800  com.mashibing.jvm.gc.TIS_FullGC_Problem01$CardInfo
   5:        283400        6801600  java.util.Date
   6:        283400        6801600  java.util.concurrent.Executors$RunnableAdapter
   7:        283400        4534400  com.mashibing.jvm.gc.TIS_FullGC_Problem01$$Lambda$2/1826771953
   8:          4726        3946808  [I
   9:             2        2662728  [Ljava.util.concurrent.RunnableScheduledFuture;
  10:          7312        1308256  [Ljava.lang.Object;
  11:          1901         152072  [C
  12:           747          85552  java.lang.Class
  13:          1889          45336  java.lang.String
  14:            42          26080  [B
  15:           929          22296  java.util.ArrayList
  16:            57          21432  java.lang.Thread
  17:           185          13320  java.lang.reflect.Field


jmap还可以把整个对导出到文件,可以离线分析


format=b标识导出格式为二进制


jmap -dump:format=b,file=/User/dbq/Documents/20201108.hprof 52272


image.png

jvisualvm离线分析堆内存


线上一般不容许jmap或者远程连接,所以需要在java启动时加上-XX:+HeapDumpOnOutOfMemoryError参数


TCPCopy:网易出的一款软件,可以将线上生产环境的tcp拷贝一份到本地,一般用于线上流量压测本地环境


九、Arthas 开源 Java 诊断工具(阿里出的)


启动并将arthas挂载到我们的程序上

dbq@mac:~/Documents/tools/jvm性能诊断工具/arthas/arthas-packaging-3.1.1$ sh as.sh
Arthas script version: 3.1.1
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
Found existing java process, please choose one and hit RETURN.
* [1]: 52193 org.jetbrains.jps.cmdline.Launcher
  [2]: 56573 com.mashibing.jvm.gc.TIS_FullGC_Problem01
  [3]: 52142
2
Arthas home: /Users/dbq/Documents/tools/jvm性能诊断工具/arthas/arthas-packaging-3.1.1
Calculating attach execution time...
Attaching to 56573 using version /Users/dbq/Documents/tools/jvm性能诊断工具/arthas/arthas-packaging-3.1.1...
real    0m1.138s
user    0m0.375s
sys 0m0.052s
Attach success.
telnet connecting to arthas server... current timestamp is 1614413542
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'
wiki      https://alibaba.github.io/arthas
tutorials https://alibaba.github.io/arthas/arthas-tutorials
version   3.1.1
pid       56573
time      2021-02-27 16:12:22
$


dashboard命令:仪表盘,可以显示线程的情况


为了便于观察,我设置了线程名称


image.png

: $ thread 类似jstack


thread 线程号,可以把该线程的详细信息打出来

"GCTest-Thead" Id=1 TIMED_WAITING
    at java.lang.Thread.sleep(Native Method)
    at com.mashibing.jvm.gc.TIS_FullGC_Problem01.main(TIS_FullGC_Problem01.java:35)
Affect(row-cnt:0) cost in 16 ms.
$


thread -b: 可以查看是否有死锁

$ thread -b
No most blocking thread found!
Affect(row-cnt:0) cost in 18 ms.
$


附录一(马士兵视频中的一些问题)


解决过哪些实际调优经验?


OOM


什么情形下会发生OOM?


相关文章
|
2月前
|
算法 Java 关系型数据库
掌握这3个技巧,你也可以秒懂JAVA性能调优和jvm垃圾回收
JVM 是一个虚拟化的操作系统,类似于 Linux 和 Window,只是他被架构在了操作系统上进行接收 class 文件并把 class 翻译成系统识别的机器码进行执行,即 JVM 为我们屏蔽了不同操作系统在底层硬件和操作指令的不同。
21 0
|
3月前
|
监控 架构师 Java
JVM 11 调优指南:如何进行JVM调优,JVM调优参数
JVM 11的优化指南:如何进行JVM调优,以及JVM调优参数有哪些”这篇文章将包含JVM 11调优的核心概念、重要性、调优参数,并提供12个实用的代码示例,每个示例都会结合JVM调优参数和Java代码
100 2
|
3月前
|
监控 架构师 Java
JVM 8 调优指南:如何进行JVM调优,JVM调优参数
这篇文章将详细介绍如何进行JVM 8调优,包括JVM 8调优参数及其应用。此外,我将提供12个实用的代码示例,每个示例都会结合JVM启动参数和Java代码。JVM调优是指通过调整Java虚拟机的配置来提升Java应用程序的性能。这包括优化堆内存设置、选择合适的垃圾收集器以及调整其他性能相关的参数。
188 0
|
21天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
60 0
|
2月前
|
存储 算法 Java
工作5年,我竟发现JVM只用这4个技巧就可以轻松调优
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。
10 0
|
2月前
|
Java
|
2月前
|
监控 算法 Java
深入理解JVM - G1调优简述
深入理解JVM - G1调优简述
23 0
|
3月前
|
Java Unix Linux
【JVM】JVM 调优参数
【1月更文挑战第27天】【JVM】JVM 调优参数
|
3月前
|
运维 监控 Java
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析的开发指南
学习JVM需要一定的编程经验和计算机基础知识,适用于从事Java开发、系统架构设计、性能优化、研究学习等领域的专业人士和技术爱好者。
54 5
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析的开发指南
|
3月前
|
存储 缓存 Java
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你认识和了解JMM并发模型的基本原理
每位Java开发者都了解到Java字节码是在Java运行时环境(JRE)上执行的。JRE包含了最为关键的组成部分:Java虚拟机(JVM),它负责分析和执行Java字节码。通常情况下,大多数Java开发者无需深入了解虚拟机的内部运行原理。即使对虚拟机的运行机制不甚了解,也不会对开发工作产生太多影响。然而,对JVM有一定了解的话,将更有助于深入理解Java语言,并解决一些看似困难的问题。
60 4
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你认识和了解JMM并发模型的基本原理