JAVA应用性能压测问题排查

交易持续缓慢-jstack

间接性缓慢-jmc/jfr(java飞行记录)找慢的这个时间找出缓慢信息进行分析

内存溢出;jmap

CPU冲高:上述均可

工具:visualvm.exe

  • jstack线程分析

JVM线程分JVM内部运行线程、用户级别的线程;

有一些 JVM内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在 JVM初始化的时候就存在,称之为JVM内部运行线程,不过我们更多的是要观察用户级别的线程

  1. 线程的状态
  2. 线程的调用栈
  3. 线程的当前锁住的资源
  1. JVM线程状态分析

线程的状态是一个重要的指标,那么线程常见的有哪些状态呢?线程在什么样的情况下会进入这种状态呢?我们能从中发现什么线索?

  • 新建状态(New) 新创建了一个线程对象
  • 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
  • 运行状态(Running) 就绪状态的线程获取了CPU,执行程序代码
  • 阻塞状态(Blocked) 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

阻塞的情况分三种:

  1. 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
  2. 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
  3. 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  • 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
  1. 通过thread dump分析线程状态

在dump中,线程一般存在如下几种状态:

  1. RUNNABLE,线程运行中或I/O等待
  2. BLOCKED,线程被阻塞,在等待monitor锁(synchronized关键字)
  3. TIMED_WAITING 线程在等待唤醒,但设置了时限
  4. WAITING 线程在无限等待唤醒
  1. 执行命令
  1. Top [PID]
  2. top -Hp [PID]
  3. printf "%x\n" {pid}
  4. jstack {pid}| grep {nid}
  • JMAP堆栈分析
  1. 指令1

命令:jmap [pid]
描述:查看进程的内存映像信息,类似 Solaris pmap 命令。

使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。这与Solaris的pmap工具比较相似。

  1. 指令2:heap

命令:jmap -heap [pid]
描述:显示Java堆详细信息

打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息

Heap Configuration: #堆内存初始化配置

   MinHeapFreeRatio = 40     #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率  

   MaxHeapFreeRatio = 70   #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率  

   MaxHeapSize = 100663296 (96.0MB)   #-XX:MaxHeapSize=设置JVM堆的最大大小

   NewSize = 1048576 (1.0MB)     #-XX:NewSize=设置JVM堆的‘新生代’的默认大小

   MaxNewSize = 4294901760 (4095.9375MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小

   OldSize = 4194304 (4.0MB)  #-XX:OldSize=设置JVM堆的‘老生代’的大小

   NewRatio = 2    #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率

   SurvivorRatio = 8  #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值

   PermSize = 12582912 (12.0MB) #-XX:PermSize=<value>:设置JVM堆的‘持久代’的初始大小  

   MaxPermSize = 67108864 (64.0MB) #-XX:MaxPermSize=<value>:设置JVM堆的‘持久代’的最大大小  

Heap Usage:

New Generation (Eden + 1 Survivor Space): #新生代区内存分布,包含伊甸园区+1个Survivor区

   capacity = 30212096 (28.8125MB)

   used = 27103784 (25.848182678222656MB)

   free = 3108312 (2.9643173217773438MB)

   89.71169693092462% used

Eden Space: #Eden区内存分布

   capacity = 26869760 (25.625MB)

   used = 26869760 (25.625MB)

   free = 0 (0.0MB)

   100.0% used

From Space: #其中一个Survivor区的内存分布

   capacity = 3342336 (3.1875MB)

   used = 234024 (0.22318267822265625MB)

   free = 3108312 (2.9643173217773438MB)

   7.001809512867647% used

To Space: #另一个Survivor区的内存分布

   capacity = 3342336 (3.1875MB)

   used = 0 (0.0MB)

   free = 3342336 (3.1875MB)

   0.0% used

tenured generation:   #当前的Old区内存分布  

   capacity = 67108864 (64.0MB)

   used = 67108816 (63.99995422363281MB)

   free = 48 (4.57763671875E-5MB)

   99.99992847442627% used

Perm Generation:     #当前的 “持久代” 内存分布

   capacity = 14417920 (13.75MB)

   used = 14339216 (13.674942016601562MB)

   free = 78704 (0.0750579833984375MB)

   99.45412375710227% used

  1. 指令3 histo:live

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

 

instances(实例数)、bytes(大小)、classs name(类名)。它基本是按照使用使用大小逆序排列的。 

#instance 是对象的实例个数

#bytes 是总占用的字节数

class name 对应的就是 Class 文件里的 class 的标识

B 代表 byte

C 代表 char

D 代表 double

F 代表 float

I 代表 int

J 代表 long

Z 代表 boolean

前边有 [ 代表数组, [I 就相当于 int[]

对象用 [L+ 类名表示

  1. 指令4:clstats

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

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

  1. 指令5:finalizerinfo

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

Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行final

  1. 指令6:dump:<dump-options>

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QC·Rex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值