JVM线上常用参数、常用工具以及异常排查

本文详细介绍了JVM参数的设置,包括数据区、收集器的配置,以及如何使用JVM提供的工具如jps、jinfo、jstat等进行性能监控。同时,针对CPU资源占用过高和OOM异常,提供了具体的排查步骤。

数据区设置

  • Xms:初始堆大小
  • Xmx:最大堆大小
  • Xss:Java 每个线程的Stack大小
  • XX:NewSize=n:设置年轻代大小
  • XX:NewRatio=n:设置年轻代和年老代的比值。如:为 3,表示年轻代与年老代比值为 1:3,年轻代占整个年轻代年老代和的 1/4。
  • XX:SurvivorRatio=n:年轻代中 Eden 区与两个 Survivor 区的比值。注意 Survivor区有两个。如:3,表示 Eden:Survivor=3:2,一个 Survivor 区占整个年轻代的 1/5。
  • XX:MaxPermSize=n:设置持久代大小。

收集器设置

  • XX:+UseSerialGC:设置串行收集器
  • XX:+UseParallelGC::设置并行收集器
  • XX:+UseParalledlOldGC:设置并行年老代收集器
  • XX:+UseConcMarkSweepGC:设置并发收集器
  • XX:+UseG1GC:G1收集器,Java9默认开启,无需设置

注:服务端jvm参数调优可移步------->:https://blog.youkuaiyun.com/Vincent2014Linux/article/details/90211192

JVM 提供的常用工具

1、jps:用来显示本地的 Java 进程,可以查看本地运行着几个 Java 程序,并显示他们的进程号。
命令格式:jps

2、jinfo:运行环境参数:Java System 属性和 JVM 命令行参数,Java class path 等信息。
命令格式:jinfo 进程 pid

3、jstat:监视虚拟机各种运行状态信息的命令行工具。
命令格式:jstat -gc 123 250 20

4、jstack:可以观察到 JVM 中当前所有线程的运行情况和线程当前状态。
命令格式:jstack 进程 pid

5、jmap:观察运行中的 JVM 物理内存的占用情况(如:产生哪些对象,及其数量)。
命令格式:jmap [option] pid
-dump:[live,]format=b,file= 使用hprof二进制形式,输出jvm的heap内容到文件, live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计 活的对象数量.
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
使用示例:jmap -heap 27900 # 展示pid的整体堆信息如下:

[root@localhost ~]# jmap -heap 27900
Attaching to process ID 27900, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 20.45-b01
using thread-local object allocation.
Mark Sweep Compact 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): #新生代区内存分布,包含Eden+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

异常排查

  • CPU 资源占用过高
    1、top 查看当前 CPU 情况,找到占用 CPU 过高的进程 PID=123。
    2、top -H -p123 找出两个 CPU 占用较高的线程,记录下来 PID=2345, 3456 转换为十六进制。
    3、jstack -l 123 > temp.txt 打印出当前进程的线程栈。
    4、查找到对应于第二步的两个线程运行栈,分析代码。

  • OOM 异常排查
    1、使用 top 指令查询服务器系统状态。
    2、ps -aux|grep java 找出当前 Java 进程的 PID。
    3、jstat -gcutil pid interval 查看当前 GC 的状态。
    4、jmap -histo:live pid 可用统计存活对象的分布情况,从高到低查看占据内存最多的对象。
    5、jmap -dump:format=b,file= 文件名 [pid] 利用 Jmap dump。
    6、使用性能分析工具对上一步 dump 出来的文件进行分析,工具有 MAT 等。

### 三、Arthas 常用 JVM 调优命令及使用指南 #### 3.1 Arthas 工具概述 Arthas 是阿里巴巴开源的一款 JVM 调试与性能分析工具,适用于 Java 应用的运行时诊断和调优。它提供丰富的命令集,可以实时查看 JVM 状态、方法执行耗时、线程堆栈、类加载信息等,特别适用于生产环境的故障排查和性能优化[^1]。 #### 3.2 核心命令与使用方法 ##### 3.2.1 查看 JVM 内存与 GC 状态 `jvm` 命令用于查看当前 JVM 的内存、GC、线程等基本信息,包括堆内存使用情况、GC 次数及耗时等。该命令适用于初步诊断内存瓶颈和 GC 异常问题。 ```bash jvm ``` ##### 3.2.2 监控方法执行耗时 `watch` 命令用于监控指定方法的入参、返回值以及执行耗时,帮助识别性能热点。例如,监控 `com.example.service.UserService.getUserById` 方法的执行情况: ```bash watch com.example.service.UserService getUserById '{params, returnObj, throwExp}' -x 2 ``` 此命令会输出方法调用的参数、返回值和异常信息,并限制输出深度为 2 层[^5]。 ##### 3.2.3 追踪方法调用链路 `trace` 命令用于追踪方法调用链路,分析方法调用耗时分布,适用于定位慢请求或复杂调用链的性能问题。例如,追踪 `com.example.controller.OrderController.createOrder` 方法: ```bash trace com.example.controller.OrderController createOrder ``` 该命令将输出整个调用链中各方法的执行时间,帮助识别性能瓶颈。 ##### 3.2.4 查看线程堆栈信息 `thread` 命令用于查看线程状态和堆栈信息,适用于排查线程阻塞、死锁等问题。例如,查看当前最忙的三个线程: ```bash thread -n 3 ``` 也可以通过线程 ID 查看具体线程的堆栈信息: ```bash thread <thread-id> ``` ##### 3.2.5 类加载与类信息查看 `sc` 和 `sm` 命令分别用于查看类加载信息和类的方法信息。例如,查看 `com.example.model.User` 类的加载器和方法: ```bash sc -d com.example.model.User sm com.example.model.User ``` ##### 3.2.6 热更新修复线上问题 `redefine` 命令支持在不重启 JVM 的情况下热更新类定义,适用于紧急修复线上问题。例如,更新 `com.example.service.UserService` 类: ```bash redefine /path/to/UserService.class ``` #### 3.3 JVM 调优常用命令对比 | 命令 | 功能描述 | 适用场景 | |------------|--------------------------------------|------------------------------| | `jvm` | 查看 JVM 内存、GC、线程等基本信息 | 初步诊断 JVM 状态 | | `watch` | 监控方法执行耗时、参数和返回值 | 分析方法性能 | | `trace` | 追踪方法调用链路 | 定位调用链性能瓶颈 | | `thread` | 查看线程堆栈信息 | 分析线程阻塞或死锁 | | `sc` / `sm`| 查看类加载和方法信息 | 分析类加载问题 | | `redefine` | 热更新类定义 | 紧急修复线上代码问题 | #### 3.4 Arthas 在 JVM 调优中的优势 相较于传统的 JVM 调优工具如 `jvisualvm` 和 `jstat`,Arthas 提供了更直观、更高效的命令行交互方式,尤其适合在无图形界面的服务器环境中使用。其命令简洁、功能强大,能够快速定位问题并提供可视化输出,极大提升了调优效率[^2]。 此外,Arthas 支持容器环境(如 Docker、Kubernetes)下的诊断,能够适应现代云原生架构下的复杂部署场景。相比 JDK 自带的 `jinfo`、`jstack` 等工具,Arthas 的命令更具语义化,降低了学习成本,提高了排查效率[^4]。 --- ```bash # 示例:使用 Arthas 查看 JVM 状态 jvm # 示例:监控方法执行耗时 watch com.example.service.UserService getUserById '{params, returnObj}' -x 2 # 示例:追踪方法调用链 trace com.example.controller.OrderController createOrder # 示例:查看线程堆栈 thread -n 3 # 示例:热更新类文件 redefine /tmp/UserService.class ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值