尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

vjtop:生产环境可用的 JVM 进程与繁忙线程实时监控工具(Java 版 top 实战指南)

vjtop:生产环境可用的 JVM 进程与繁忙线程实时监控工具(Java 版 top 实战指南) 开发工具可观测性后端【免费下载链接】vjtoolsThe vip.coms java coding standard, libraries and tools项目地址https://gitcode.com/gh_mirrors/vj/vjtools点击查看免费下载vjtop 是 vjtools 项目中面向 JVM 的实时监控命令行工具它扮演的是JVM 进程指标及其繁忙线程的 top 角色像 dstat 一样把 OS 与 JVM 层面的重要指标一次性呈现在眼前又像 top 一样持续跟踪最繁忙的线程并支持实时交互打印线程栈。读完本文你将掌握 vjtop 的下载运行、六大线程排序模式、全部命令行参数与交互命令、输出字段的精确含义、数据采集原理、变色告警阈值以及线上 attach 失败的排查与绕行方案。1. 为什么需要 vjtop传统排查哪个 Java 线程在忙的方式非常繁琐先用top -H列出线程再执行jstack拿到全部线程快照最后手工换算十进制与十六进制的线程号TID ↔ nid。这个过程既低效又因为jstack会造成 JVM 停顿而难以在线上反复执行。vjtop 的目标正是解决这三个痛点一站式呈现将进程在 OS 层面CPU、物理内存、SWAP、磁盘 IO、线程数与 JVM 层面堆内各分代、CodeCache、堆外 direct/map、线程栈、GC、SafePoint的所有重要指标集中显示风格类似 dstat持续跟踪热点线程按时间区间内的 CPU、SYS CPU、总 CPU 或内存分配速度对线程排序可连续刷新观察趋势低侵入、可交互数据采集不引入应用停顿取栈除外可在线上安全使用对超出正常范围的值自动变色提示支持实时输入命令翻查指定线程的 stack trace。从源码结构看vjtop 是在 jvmtop当前源码版本为 1.0.9见VJTop.VERSION常量。常用场景性能问题快速定位用 vjtop 显示 CPU 繁忙或内存消耗大的线程再实时交互翻查该线程的 stack trace压测场景像用 dstat 监控 OS 指标一样用 vjtop 实时反馈 JVM 进程状态生产环境应用出问题时快速了解进程状态也可与监控系统结合在指标如 CPU、超时请求数超阈值时用钩子脚本调用 vjtop 记录事发地现场。2. 快速上手下载、权限与基本用法2.1 获取与运行前提vjtop 已发布到 Maven Central可下载 zip 包解压使用README 中给出了 1.0.8 的下载地址。解压后目录中即包含vjtop.sh启动脚本与vjtop.jar。运行 vjtop 的前提条件与jstack相同与目标 JVM 使用相同用户运行attach 机制强制校验vjtop 自身使用JAVA_HOME/bin/java需要JDK 7 及以上但不要求与目标应用 JVM 使用相同 JDK 版本见下文执行问题排查JDK 8 及以前需要依赖JAVA_HOME/lib/tools.jar。启动脚本 vjtop.sh 会依次完成定位JAVA_HOME环境变量优先未定义时通过which java的 readlink 推导→ 探测 JDK 版本8 for 1.8.0_nn, 9 for 9-ea→ 为 JDK8 及以前追加tools.jar到 classpath → 以固定 JVM 参数-Xms256m -Xmx256m -XX:NewRatio1 -Xss256k -XX:UseSerialGC ...启动com.vip.vjtools.vjtop.VJTop。2.2 基本命令# 默认模式按时间区间内线程占用 CPU 排序显示前 10 名每 10 秒刷新一次 ./vjtop.sh PID # 打印所有选项不同版本参数可能变动以 -h 输出为准 ./vjtop.sh -h如果未传入 PIDvjtop 会尝试通过jps列表交互选择进程见 OptionAdvanceParser.java 中的parsePid()。3. 找出 CPU 最繁忙的线程3.1 命令参数# 按时间区间内线程占用的 CPU 排序默认显示前 10默认每 10 秒打印一次 ./vjtop.sh PID # 按时间区间内线程占用的 SYS CPU 排序 ./vjtop.sh -m syscpu PID # 按线程从启动以来的总占用 CPU 排序 ./vjtop.sh -m totalcpu PID # 按线程从启动以来的总 SYS CPU 排序 ./vjtop.sh -m totalsyscpu PID这四种模式对应 VMDetailView.java 中ThreadInfoMode枚举的cpu / syscpu / totalcpu / totalsyscpu四态交互模式下也支持用数字 1–4 切换。3.2 输出示例与逐字段解读PID: 191082 - 17:43:12 JVM: 1.7.0_79 USER: calvin UPTIME: 2d02h PROCESS: 685.00% cpu(28.54% of 24 core), 787 thread MEMORY: 6626m rss, 6711m peak, 0m swap | DISK: 0B read, 13mB write THREAD: 756 live, 749 daemon, 1212 peak, 0 new | CLASS: 15176 loaded, 161 unloaded, 0 new HEAP: 630m/1638m eden, 5m/204m sur, 339m/2048m old NON-HEAP: 80m/256m/512m perm, 13m/13m/240m codeCache OFF-HEAP: 0m/0m direct(max2048m), 0m/0m map(count0), 756m threadStack GC: 6/66ms/11ms ygc, 0/0ms fgc | SAFE-POINT: 6 count, 66ms time, 5ms syncTime TID NAME STATE CPU SYSCPU TOTAL TOLSYS 23 AsyncAppender-Worker-ACCESSFILE-ASYNC WAITING 23.56% 6.68% 2.73% 0.72% 560 OSP-Server-Worker-4-5 RUNNABLE 22.58% 10.67% 1.08% 0.48% 9218 OSP-Server-Worker-4-14 RUNNABLE 22.37% 11.45% 0.84% 0.40% 8290 OSP-Server-Worker-4-10 RUNNABLE 22.36% 11.24% 0.88% 0.41% 8425 OSP-Server-Worker-4-12 RUNNABLE 22.24% 10.72% 0.98% 0.47% 8132 OSP-Server-Worker-4-9 RUNNABLE 22.00% 10.68% 0.90% 0.42% 8291 OSP-Server-Worker-4-11 RUNNABLE 21.80% 10.09% 0.89% 0.41% 8131 OSP-Server-Worker-4-8 RUNNABLE 21.68% 9.77% 0.93% 0.44% 9219 OSP-Server-Worker-4-15 RUNNABLE 21.56% 10.43% 0.90% 0.41% 8426 OSP-Server-Worker-4-13 RUNNABLE 21.35% 10.42% 0.66% 0.31% Total : 668.56% cpu(user473.25%, sys195.31%) by 526 atcive threads(which cpu0.05%) Setting: top 10 threads order by CPU, flush every 10s Input command (h for help):进程区数据解释字段含义PROCESSthread为进程的 OS 线程数cxtsw为主动与被动的线程上下文切换数cpu为进程 CPU 占用括号内为占整机核数比例MEMORYrssResident Set Size为进程实际占用的物理内存peak为历史峰值 rssswap为被交换到磁盘的虚拟内存DISK真正达到物理存储层的读/写速度来自/proc/PID/io的read_bytes/write_bytesTHREADJava 线程数live为当前活跃数daemon为其中的守护线程数peak为峰值new为刷新周期内新建线程数CLASSloaded为当前加载类数量unloaded为累计卸载类数量new为周期内新加载类数量HEAP1.0.3 起每项含三个数字当前使用 / 当前已申请 / 最大内存后两个数字相同时自动合并显示。sur为存活区大小注意实际有 from、to 两个存活区NON-HEAP数字含义同HEAPcodeCache为 JIT 编译二进制代码存放区写满后将无法编译新代码direct堆外内存三数字含义同HEAP未显式设置最大内存时约等于堆内存大小。注意新版 Netty 不经过 JDK API 分配的部分未在此统计map映射文件内存三个数字分别为 map 数量 / 当前使用 / 当前已申请无最大值threadStackJava 线程栈内存总和不含 VM 线程since 1.0.3ygcYoungGC次数 / 总停顿时间 / 平均停顿时间fgcOldGCFullGC次数 / 总执行时间注意此时间仅为执行时间非 JVM 停顿时间SAFE-POINTPerfData 开启时可用JVM 真正停顿的次数与时间以及等待所有线程进入安全点syncTime所消耗的时间线程区数据解释字段含义CPU线程在打印间隔内使用的 CPU 百分比按单个核计算SYSCPU线程在打印间隔内使用的 SYS CPU 百分比按单个核计算TOTAL从进程启动至今线程总 CPU 时间占进程总 CPU 时间的百分比TOLSYS从进程启动至今线程总 SYS CPU 时间占进程总 CPU 时间的百分比底部汇总Total行给出间隔内所有活跃 Java 线程合计的 CPUuser/sys 拆分与活跃线程数Setting行回显当前排序模式、过滤条件与刷新间隔。若线程平均使用 CPU 低于单核的 0.05%源码中过滤阈值为upTimeMills.delta * NANOS_TO_MILLS / 10000见 TopThreadInfo.java将不参与排序显示以降低监控自身开销。4. 找出内存分配最频繁的线程除了 CPUvjtop 还能通过 ThreadMXBean 的线程内存分配计数getThreadAllocatedBytes从 SJK 借鉴而来找出分配大户——这类线程往往是 GC 压力的主要制造者。4.1 命令参数# 按线程分配内存的速度排序默认显示前 10默认每 10 秒打印一次 ./vjtop.sh -m 5 PID # 按线程的总内存分配而非间隔内增量排序 ./vjtop.sh -m 6 PID交互模式下对应ThreadInfoMode.memory / totalmemory。4.2 输出示例与字段解读(忽略头信息) THREADS-MEMORY: 30k/s allocation rate TID NAME STATE MEMORY TOTAL-ALLOCATED 47636 RMI TCP Connection(583)-127.0.0.1 RUNNABLE 27k/s(88.76%) 17m( 0.00%) 1 main RUNNABLE 2k/s( 8.44%) 370g(83.16%) 47845 JMX server connection timeout 47845 TIMED_WAIT 251/s( 0.80%) 21k( 0.00%) 46607 Worker-501 TIMED_WAIT 60/s( 0.19%) 934m( 0.20%) 46609 Worker-502 TIMED_WAIT 60/s( 0.19%) 822m( 0.18%) 46610 Worker-503 TIMED_WAIT 60/s( 0.19%) 737m( 0.16%) 46763 Worker-504 TIMED_WAIT 60/s( 0.19%) 696m( 0.15%) 46764 Worker-505 TIMED_WAIT 60/s( 0.19%) 743m( 0.16%) 47149 Worker-506 TIMED_WAIT 60/s( 0.19%) 288m( 0.06%) 46551 Worker-500 TIMED_WAIT 60/s( 0.19%) 757m( 0.17%)进程区数据allocation rate为所有线程在打印间隔内每秒分配的内存总和。线程区数据STATE线程当前状态RUNNABLE / TIMED_WAIT 等MEMORY该线程分配内存的瞬时速率每秒字节数括号内为该线程每秒分配占所有线程每秒分配总量的百分比TOTAL-ALLOCATED该线程从启动至今分配的内存累计值包含已回收对象的内存括号内为占所有线程累计总量的百分比。与 CPU 模式类似若线程平均分配速度低于 1K/s则不参与排序显示减少消耗。5. 完整命令行参数vjtop 使用 joptsimple 解析参数全部选项定义见 OptionAdvanceParser.java# 打印所有选项 ./vjtop.sh -h # 结果输出到文件重定向 ./vjtop.sh PID /tmp/vjtop.log # 每 5 秒打印一次默认 10 秒-i 与 -d 等价且值不能小于 1 ./vjtop.sh -i 5 PID # 打印 20 次后自动退出默认不限次数 ./vjtop.sh -n 20 PID # 显示前 100 个线程默认 10 ./vjtop.sh -l 100 PID # 不带变色与换页控制码的 clean 模式适合不支持控制码的终端 # 在 Windows 及输出重定向到文件时自动使用该模式 ./vjtop.sh -o clean PID # key:value 文本模式供第三方监控工具采集 vjtop 输出如 process.cpu.core、rss、ygc.count ./vjtop.sh -o text PID # 只采集 JVM 信息不采集繁忙线程信息 ./vjtop.sh -c jvm PID # 只采集繁忙线程信息不采集 JVM 信息 ./vjtop.sh -c thread PID # 只显示线程名包含 worker 的线程热点线程与交互打印线程时都会过滤1.0.6 起忽略大小写 ./vjtop.sh -f worker PID # 更宽的 120 字节屏幕默认 100最小 80 ./vjtop.sh -w 120 PID /tmp/vjtop.log参数速查表对应源码createOptionParser()选项别名含义默认值-niteration输出 N 次后退出不限-i/-dinterval刷新间隔秒须 ≥ 110-wwidth控制台显示列数100最小 80-llimit显示的线程数10-ffilter线程名过滤大小写不敏感无正则无-mmodecpu / syscpu / totalcpu / totalsyscpu / memory / totalmemorycpu-ooutputconsole / clean / textconsole-ccontentall / jvm / threadall-jjmxurlattach 失败时直接指定 JMX 地址如127.0.0.1:7001无其中-o text模式输出形如key:value的纯文本源码见 VMDetailView.java 的printJvmInfoAsText()例如process.cpu.core、rss、swap、eden.use/commit/max、ygc.count/time/avgtime、safePoint.count/time/syncTime、thread-tid:name state cpu syscpu total tolsys等非常便于接入 Zabbix、Prometheus exporter 等采集链路。6. 实时交互运行时动态诊断vjtop 在交互式终端System.console()非空下会启动独立的后台交互线程InteractiveTask.java在底部提示Input command (h for help):让你无需退出即可完成从看指标到看现场的完整排查。6.1 打印线程 Stack Trace1. 打印指定线程的栈输入t再输入线程号也可直接输入s tid。只取一条线程信息引入的暂停非常短Input command (h for help):s Input TID for stack:4161 at java.lang.Object.wait(Native Method) at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188) at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:52)上例也可直接输入s 4161。对应源码ThreadPrinter.printStack(tid)取栈深度 20 帧。2. 打印 Top 繁忙线程的栈输入t。只取若干条线程信息停顿很短Input command (h for help):t Stack trace of top 10 threads: 15: RMI TCP Connection(15)-10.100.150.221 java.lang.Thread.State: RUNNABLE at sun.management.ThreadImpl.getThreadInfo1(Native Method) at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:178) ...3. 打印所有 BLOCKED 线程的栈输入b。取所有线程信息时间比前两者略长但因为不获取锁信息、不拿 JNI global references 等数据仍比jstack快Input command (h for help):b Stack trace of blocked threads: ...4. 打印所有线程的 TID 和线程名输入a。只取名称与状态、不取栈不引入暂停输出末尾还会按线程状态给出统计摘要Thread Id and name of all live threads: 16 : JMX server connection timeout 16 (TIMED_WAITING) 15 : RMI TCP Connection(15)-10.100.150.221 (RUNNABLE) 13 : RMI Scheduler(0) (TIMED_WAITING) 11 : RMI TCP Accept-0 (RUNNABLE) 9 : Attach Listener (RUNNABLE) 4 : Signal Dispatcher (RUNNABLE)打印栈时printSingleThread见 ThreadPrinter.java还会附带阻塞/等待统计blocked count/time、waited count/time、是否挂起suspended、是否 native、锁信息lock、lock owner等信息量接近 jstack 单线程视图。6.2 实时切换显示模式与参数1. 改变显示与排序模式输入m再输入 1–6 的数字Input command (h for help):m Input number of Display Mode(1.cpu, 2.syscpu 3.total cpu 4.total syscpu 5.memory 6.total memory, current cpu): 52. 改变显示间隔输入i或直接i 20Input command (h for help):i Input flush interval seconds(current 10):20 Flush interval change to 20 seconds3. 设定显示的线程数输入l或直接l 20Input command (h for help):l Input number of threads to display :20 Number of threads to display changed to 20 for next flush4. 按线程名过滤输入f。打印繁忙线程和全部线程时线程名都必须包含 filter 字符串大小写不敏感不支持正则与通配符Input command (h for help):f Input filter of thread name (current null):Worker thread name filter change to Worker for next flush (3s later)其他命令q/quit/exit退出h/help打印帮助。值得一提的是m在 CPU 模式与内存模式之间切换时会清理线程历史快照cleanupThreadsHistory()保证新模式的增量计算从零开始。7. 工作原理三层数据来源与低开销设计7.1 进程区数据来源vjtop 的进程级数据来自三个渠道README 第 3 章源码实现在 VMInfo.java 与 JmxClient.java/proc/PID/*进程物理内存rss、peak、swap、OS 线程数、磁盘 IO读取/proc/PID/status与/proc/PID/io详见 ProcFileData.javaPerfDataJDK 每秒写入/tmp/hsperfdata_$userid/$pid的统计数据从中读取线程数、类加载数、GC 次数/耗时、SafePoint 次数/耗时/同步耗时等计数器见initPerfCounters()中java.threads.live、sun.gc.collector.0.invocations、sun.rt.safepoints等计数器名JMX通过目标 JVM 的 JMX 获取数据若目标 JVM 未启动 JMX则通过 attach 机制动态加载 management agent见attachToGetConnectorAddress()。优先级规则同一指标若 PerfData 与 JMX 都有优先使用 PerfData——因为 PerfData 读取的是 JDK 已写好的内存映射文件开销远小于走 JMX RMI。网络流量数据在/proc/PID/*中无法按进程区分因此 vjtop 不监控网络。从源码实现看JMX 通道还包装了一层 Snapshot 缓存借鉴 JDK 自带实现同一刷新周期内对同一 MBean 属性的多次getAttribute只实际调用一次远程连接其余命中本地缓存flush()时才重新拉取进一步压低远程调用次数JmxClient.java 内嵌的SnapshotInvocationHandler。7.2 线程区数据来源线程热点统计完全基于 ThreadMXBean 的三个批量操作README 第 3.2 节源码见 TopThreadInfo.javagetAllThreadIds()获得所有 Thread IdgetThreadCpuTime(tids)/getThreadUserTime(tids)批量获得所有线程的 CPU 时间、SYS CPU 时间内存模式下调用getThreadAllocatedBytes(tids)批量获得内存分配量com.sun.management.ThreadMXBean扩展能力因此要求目标 JVM 支持 ThreadAllocatedMemory否则打印提示后跳过排序后仅对前 N 名调用getThreadInfo(tids)取线程名/状态等信息——因为不取线程的 StackTrace不会阻塞应用。两个值得注意的工程细节源码注释原话两次批量取数之间的时间差可能造成低流量下 SYS CPU 为负数因此代码用Math.max(0, ...)兜底首次刷新不显示数据增量计算依赖上一次快照lastThreadCpuTotalTimes等首轮只有快照没有增量readyfalse会打印Collecting data, please wait ......从第二轮开始才展示区间数据保证每个百分比都是真实的区间内数值。7.3 监控工具自身的开销vjtop 非常在意监控行为本身对目标进程的扰动默认刷新间隔 10s、低于阈值CPU 0.05%、内存 1K/s的线程不参与排序、JMX 批量取数 Snapshot 缓存、优先读 PerfData都是围绕低开销设计的。启动脚本 vjtop.sh 也为监控进程自身设置了保守的 JVM 参数256m 堆、SerialGC、256k 线程栈等避免监控工具反过来拖垮服务器。8. 变色告警规则vjtop 会对超出正常范围的值进行黄/红变色提示阈值定义集中在 WarningRule.java指标黄色告警红色告警进程 CPU服务器总 CPU 50%70%进程线程数≤8 核核数×1508 核核数×100≤8 核核数×2258 核核数×150进程内存—swap 一旦使用即红LongWarning(1, 1)磁盘 IO30MB/s100MB/s类加载新加载类即黄newClass 1当前加载类 8 万当前加载类 15 万老生代 / perm(metaspace) / CodeCache设置了 Max 时Max 的 85%Max 的 95%线程数 new周期内新建 1 条每秒新建 2 条YGC次数每秒 1 次平均耗时 100ms总耗时达应用运行时间 5%次数每秒 2 次平均耗时 200ms总耗时达 10%FGC周期内 1 次周期内 2 次SAFEPOINT次数每秒 2 次总耗时达运行时间 5%次数每秒 4 次总耗时达 10%其中依赖运行环境的阈值是动态计算的updateProcessor()/updateInterval()例如线程数告警会随 CPU 核数调整YGC 次数告警为intervalSeconds1与intervalSeconds*21SafePoint 为intervalSeconds*2与*4时间类告警为刷新间隔的 5%/10%——这意味着刷得越频繁告警越灵敏反之越宽容。9. 执行问题排查9.1 JDK 版本错误或 tools.jar 不存在vjtop 使用的 java 为JAVA_HOME/bin/java需要 JDK 7 及以上但不要求与目标应用的 JVM 使用相同 JDK 版本。JDK 8 及以前依赖JAVA_HOME/lib/tools.jar脚本会检查其存在性缺失即报错退出。JAVA_HOME的定位顺序读取环境变量JAVA_HOME未定义时通过which java定位 java 可执行文件再推导相对路径。若仍未找到脚本会提示Please set JAVA_HOME env before run this script。JDK 9 已无 tools.jar脚本通过版本探测GET_JDK_VERSION自动跳过该依赖若运行时缺少 JDK 内部类主程序会捕获NoClassDefFoundError并提示检查JAVA_HOME是否指向 JDK 而非 JRE。9.2 不能连入目标 JVMvjtop 使用 JVM attach 机制连入 PID 并获得 JMX 本地连接地址所需权限与jstack相同。attach 失败时输出ERROR: Could not attach to process.可先执行jstack PID对比效果。常见原因与对策PID 写错进程不存在用户不一致attach 时强制校验执行 vjtop 的用户与目标 JVM 用户一致否则抛出well-known file is not secure之类异常。有 sudo 权限时可切换到目标用户并把 JAVA_HOME 等环境变量带过去sudo -E su - targetUser/tmp/.java_pid$PID文件被误删该文件首次连接时生成若之后被文件清理脚本错误删除JVM 将不再能连入只能重启应用目标 JVM 用-Djava.io.tmpdir重定向了 tmp 目录导致读不到/tmp/.java_pid$PID目标 JVM 使用-XX:DisableAttachMechanism禁止了 attach。绕行方案直接配置 JMX 地址。如果实在无法 attach可在目标进程启动参数中开启远程 JMX-Djava.rmi.server.hostname127.0.0.1 -Dcom.sun.management.jmxremote.port7001 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.Xfalse -Dcom.sun.management.jmxremote.sslfalse然后让 vjtop 直连该地址since 1.0.3对应源码parsePid中的-j/--jmxurl选项连接串构造见JmxClient.connect()./vjtop.sh -j 127.0.0.1:7001 PID9.3 数据缺失提示非 Linux 系统进程的 MEMORY / THREAD / DISK 数据将被跳过/proc/PID/io不可读不同用户DISK 数据跳过PerfData 不可用SAFE-POINT 数据跳过相关数据回退到 JMX 获取目标 JVM 不支持线程 CPU/内存分配遥测打印相应提示并跳过对应模式。10. 与 jvmtop 相比的改进点vjtop 从 jvmtop fork 而来针对生产环境做了系统性改进README 第 6 章进程概览新增进程物理内存、SWAP、IO、物理线程信息将内存信息与 GC 信息按不同分代独立显示新增 CodeCache、堆外内存、Thread Stack 内存、SafePoint 等信息对偏离正常范围的值进行变色提示。热点线程新增线程内存分配速度展示与排序from SJK新增线程 SYS CPU、启动以来总 CPU 的排序from SJK新增打印间隔、展示线程数等配置项。实时交互支持打印单条线程栈、TopN 繁忙线程栈、所有 BLOCKED 线程栈支持打印全部线程名支持实时切换显示模式/排序、刷新频率与显示线程数。为生产环境运行优化删除 jvmtop 会造成应用停顿的 Profile 页面删除 jvmtop 获取所有 Java 进程信息、结果不确定的 Overview 页面默认打印间隔调整到 10s进程信息优先从 PerfData 而非 JMX 读取减少消耗线程信息通过批量获取线程 CPU 时间等方式减少数倍耗时from SJK支持输出文本格式给第三方监控工具支持只输出 JVM 信息或繁忙线程信息支持 attach 始终失败时直接配置 JMX 地址连入。11. 小结vjtop 把OS 指标 JVM 指标 热点线程 交互式线程栈整合进一个 top 风格的终端界面并用 PerfData 优先、JMX 批量取数、阈值过滤等手段将监控自身开销压到极低是生产环境与压测场景下定位 JVM 性能问题的实用工具。相关实现可继续在仓库中深入研读主入口 VJTop.java、视图与输出 VMDetailView.java、数据采集 VMInfo.java、线程热点统计 TopThreadInfo.java、告警规则 WarningRule.java、JMX 连接 JmxClient.java以及启动脚本 vjtop.sh。赞分享开发工具可观测性后端【免费下载链接】vjtoolsThe vip.coms java coding standard, libraries and tools项目地址https://gitcode.com/gh_mirrors/vj/vjtools点击查看免费下载相关推荐Java多线程性能监控终极指南JVM工具与自定义监控的实现Java多线程性能监控终极指南JVM工具与自定义监控的实现 想要优化Java应用性能多线程性能监控是关键本文将为你提供完整的Java多线程性能监控指南涵AI 技能人工智能媒体生成提示工程linux-tutorial 之 iotop实时按进程监控磁盘 I/O 的 top 类工具实战指南linux tutorial 之 iotop实时按进程监控磁盘 I/O 的 top 类工具实战指南 iotop 是一个实时监视磁盘 I/O 使用状况的 top文档教程运维如何快速上手SerialTool跨平台串口调试的完整指南如何快速上手SerialTool跨平台串口调试的完整指南 SerialTool是一款功能强大的跨平台串口和网络调试工具专为嵌入式开发者、物联网工程师和硬件爱上一篇终极Arkime插件开发指南从零开始扩展自定义协议解析能力下一篇awesome-behavioral-interviews如何构建行为面试中的创新案例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表