jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行

文章目录

    • 1. 背景
    • 2. jattach简介
    • 3. 容器内安装jattach工具
      • 3.1 容器内可访问外网安装jattach工具的方法
      • 3.2 容器内无法访问外网安装jattach工具的方法
    • 4. 在容器内使用jattach工具定位JVM问题/调优JVM
      • 4.1 jttach命令介绍
      • 4.2 在容器内实际操作jattach命令
        • 4.2.1 properties 打印系统属性
        • 4.2.2 datadump 展示堆和线程统计信息
        • 4.2.3 threaddump 转储当前所有线程的追踪信息
        • 4.2.4 dumpheap 展示堆内存对象的统计信息
        • 4.2.5 inspectheap 展示堆内存对象的统计信息
        • 4.2.6 printflag 打印虚拟机的参数
        • 4.2.7 setflag 动态调整虚拟机的参数
        • 4.2.8 jcmd 执行jcmd命令
    • 5. 结束语


1. 背景

前段时间有业务项目提出生产环境有个Java业务实例响应缓慢,想通过分析JVM的线程堆栈等信息定位问题原因。但是他们使用的Open JDK是只安装了JRE,没有安装JDK的版本,无法使用JVM的一些常用命令。 我们通过在容器内安装并使用jattach工具成功协助项目组定位并解决了问题。本文主要介绍了如何在容器内安装和使用jattach工具分析JVM运行过程中存在的问题(非容器同样适用)

2. jattach简介

  • 通过动态附加机制向JVM进程发送命令的实用程序。
  • 一体化集成jmap + jstack + jcmd + jinfo功能在一起的程序
  • 不需要安装JDK,只需要JRE就能工作,支持Linux容器。

3. 容器内安装jattach工具

3.1 容器内可访问外网安装jattach工具的方法

通过curl/wget命令下载

  curl -O -L https://github.com/jattach/jattach/releases/download/v2.1/jattach
  chmod +x jattach

jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第1张图片

注意: 若使用curl命令在此处要加上 -L,否则会因为重定向导致下载文件为空

3.2 容器内无法访问外网安装jattach工具的方法

通过kubectl cp或者docker cp 命令,此处为了方便演示使用kubectl cp

假如现在要往“grpc-server-556786dcbc-2fnxs”这个pod中的“container-r1clbo”容器里复制jattach工具
    chmod +x jattach // 注意此处要先加上执行权限
    kubectl cp /Users/apple/Downloads/jattach grpc-server-556786dcbc-2fnxs:/app/jattach -c container-r1clbo  -n platform

其中:
1. /Users/apple/Downloads/jattach 是本地文件路径
2. grpc-server-556786dcbc-2fnxs 是pod名称
3. /app/jattach 是容器内文件路径
4. -c后面的container-r1clbo是容器名称

从本地复制命令如下:
kb-cp

文件复制到容器内结果如下:
jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第2张图片

4. 在容器内使用jattach工具定位JVM问题/调优JVM

4.1 jttach命令介绍

命令 描述
load 加载agent包
properties 打印系统属性
agentProperties 打印agent属性
datadump 展示堆和线程统计信息
threaddump 转储当前所有线程的追踪信息(类似 jstack)
dumpheap dump 堆信息 (类似 jmap)
inspectheap 展示堆内存对象的统计信息 (类似 jmap -histo)
setflag 动态调整虚拟机的参数 (类似 jinfo -flag)
printflag 打印虚拟机的参数 (类似 jinfo -flag)
jcmd 执行jcmd命令

4.2 在容器内实际操作jattach命令

4.2.1 properties 打印系统属性

jattach [pid] properties

jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第3张图片

4.2.2 datadump 展示堆和线程统计信息

jattach [pid] datadump

注意: 此命令是将dump所有线程信息和当前堆信息输出到应用的标准输出里了,而不是执行jattach命令所在的终端
jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第4张图片

执行datadump命令后在应用程序标准输出日志中查看线程dump信息和堆信息如下

jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第5张图片
jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第6张图片

4.2.3 threaddump 转储当前所有线程的追踪信息

jattach [pid] threaddump

jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第7张图片

4.2.4 dumpheap 展示堆内存对象的统计信息

jattach [pid] dumpheap [fileName]

jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第8张图片

4.2.5 inspectheap 展示堆内存对象的统计信息

jattach [pid] inspectheap

jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第9张图片

4.2.6 printflag 打印虚拟机的参数

jattach [pid] printflag [flagName]

jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第10张图片

4.2.7 setflag 动态调整虚拟机的参数

jattach [pid] setflag [flag,flagValue …]

jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第11张图片

4.2.8 jcmd 执行jcmd命令

jattach [pid] jcmd [command]

查看线程信息
jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第12张图片

查看堆内存信息

jattach-一个集成jmap、jstack、jinfo、jcmd功能的轻量级JVM工具,无需JDK也能运行_第13张图片

5. 结束语

此篇文章罗列了jattach工具的基本用法,对定位、分析实际项目中出现的JVM性能问题有很大的帮助,属于开箱即用的轻量级工具,希望对大家调优JVM带来帮助,也欢迎大家在评论区分享更优的工具和实战方案

你可能感兴趣的:(java,jvm,java,开发语言)