什么是 Arthas?

Arthas 是一款开源在线诊断工具,采用命令行交互模式,支持 web 端在线诊断,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。这是一款开源一年多 GitHub star 2 万,99% 的阿里研发小哥都在用的 Java 终极诊断利器!相对比直接下载使用,我推荐开发者可以试一下通过 IDE插件 Cloud Toolkit 中使用Arthas 来实现一键远程诊断功能。

得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。

  • 是否有一个全局视角来查看系统的运行状况?
  • 为什么 CPU 又升高了,到底是哪里占用了 CPU ?
  • 运行的多线程有死锁吗?有阻塞吗?
  • 程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?
  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 有什么办法可以监控到 JVM 的实时运行状态?

Arthas 的命令、功能在其官方文档有详细介绍,下文将介绍一下近期几个使用场景。

场景 1:定位压测时的性能瓶颈

平时服务器请求都很正常。压测时,依赖的服务、数据库也都没有到达瓶颈,但是机器的 CPU 全部飘红,why?

通过 jstack 命令,只能看到某一时刻的堆栈,没有抓到真凶。

thread 查看当前线程信息,查看线程的堆栈。

thread -n 3 -i 10000 可以统计 10 秒内最忙的 3 个线程,并且打印它们的堆栈,很容易发现问题。最终发现的问题比较简单:日志中打印了 location 的信息,包括 类名、方法名和行号。

动态获取代码的方法名、行号等信息,通常是通过 new Throwable() -> 打印 Throwable 的堆栈 -> 截取堆栈中最顶层的业务代码 -> 拆分字符串获取类、方法、行号等信息, 打印堆栈对性能损耗是比较大的。

场景 2:检测偶发的超时

有段时间,总是碰到几次偶尔的超时,但是看日志都正常,鹰眼的调用链路都完全 ok,没有哪一步数据库操作或者 HSF 调用是特别慢的。

各种监控统计的时间维度的耗时,都十分正常,无法找到那个 rt 的尖刺。

想到了可能是日志的问题,但是没有证据支撑。

trace 命令能监控每一步的耗时,并且可以配合条件表达式,当耗时超过 xx ms 时打印详细日志。

找台机器,输入命令,后面的就是静等了。再次出现 rt 尖刺时,能够捕捉到耗时的分布情况。

通过 Arthas 拿到的结果,定位到是日志打印的问题。同步日志改为异步日志后,问题解决。

场景3:debug?那要是动态字节码生成咋办?

之前碰到过一个 json 序列化时输出的数字带不带引号的问题。当时各种 debug、看代码,发现是通过 ASM 动态字节码的方式生成的序列化类。到这完全放弃了,debug 已经无法定位问题了。当时通过另外一种方式避免了这种问题。

反过来看这个问题的时候,我们可以通过 Arthas 的 jad 命令,反编译动态字节码生成的类,结合 watch 等命令,定位排查问题。

jad——反编译指定已加载类的源码

还可以通过 mc(menory compiler), redefine 命令线上热更新代码,欢迎探索。

最后

给读者们一个小福利,有需要这些资料的朋友们可以点击我,即可免费领取资料!

ActiveMQ消息中间件面试专题

  • 什么是ActiveMQ?
  • ActiveMQ服务器宕机怎么办?
  • 丢消息怎么办?
  • 持久化消息非常慢怎么办?
  • 消息的不均匀消费怎么办?
  • 死信队列怎么办?
  • ActiveMQ中的消息重发时间间隔和重发次数吗?

ActiveMQ消息中间件面试专题解析拓展:


redis面试专题及答案

  • 支持一致性哈希的客户端有哪些?
  • Redis与其他key-value存储有什么不同?
  • Redis的内存占用情况怎么样?
  • 都有哪些办法可以降低Redis的内存使用情况呢?
  • 查看Redis使用情况及状态信息用什么命令?
  • Redis的内存用完了会发生什么?
  • Redis是单线程的,如何提高多核CPU的利用率?


Spring面试专题及答案

  • 谈谈你对 Spring 的理解
  • Spring 有哪些优点?
  • Spring 中的设计模式
  • 怎样开启注解装配以及常用注解
  • 简单介绍下 Spring bean 的生命周期

Spring面试答案解析拓展


高并发多线程面试专题

  • 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
  • Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
  • Java 中 wait 和 sleep 方法有什么区别?
  • 如何在 Java 中实现一个阻塞队列?
  • 如何在 Java 中编写代码解决生产者消费者问题?
  • 写一段死锁代码。你在 Java 中如何解决死锁?

高并发多线程面试解析与拓展


jvm面试专题与解析

  • JVM 由哪些部分组成?
  • JVM 内存划分?
  • Java 的内存模型?
  • 引用的分类?
  • GC什么时候开始?

JVM面试专题解析与拓展!


JVM 由哪些部分组成?

  • JVM 内存划分?
  • Java 的内存模型?
  • 引用的分类?
  • GC什么时候开始?

JVM面试专题解析与拓展!

[外链图片转存中…(img-I3fjSlka-1625937011685)]

java游戏源码合集,已整理成文档相关推荐

  1. 【亲测】80个经典在线休闲H5小游戏源码合集,直接上传空间即可使用,可玩性还不错

    约有八十个左右的H5小休闲游戏,代码无加密,上传即可使用,可以拿来放自己网站上引流,提升用户体验和黏度; 游戏的可玩性还是挺好的,可算得上是引流神器. 不需要建新站 直接上传到任意站点都可以运行. 游 ...

  2. Android游戏源码合集(主要是AndEngine和Libgdx的)

    最近在网络上看到有网友抱怨Android游戏源码找不到,所以小弟收集了一些AndEngine和Libgdx的游戏源码,以Eclipse工程的形式配置好环境,再陆续发出( 某引擎避嫌,不在此列). 虽说 ...

  3. Cocos2dx游戏源码合集

    http://blog.csdn.net/iamlazybone/article/details/19612941 懒骨头(http://blog.csdn.net/iamlazybone QQ:12 ...

  4. Cocos2dx游戏源码合集(BY懒骨头+持续更新+2014.03.17)

    懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 青岛) 有很多同学问源码,干脆出个索引贴,以后持续更新 ====================== ...

  5. java全栈工程师前景,已整理成文档

    高频问题 1.上一家公司,你为什么会离职? 公司很好,但是公司调整了业务,接下来的发展路线和自己的目标不一致,所以要换工作 工作太清闲,学不到知识,我不怕累,就是想多锻炼自己,想找具有挑战力工作 公司 ...

  6. java公路车官网,已整理成文档

    为什么要优化 Ngin HTTPS 延迟 Nginx 常作为最常见的服务器,常被用作负载均衡 (Load Balancer).反向代理 (Reverse Proxy),以及网关 (Gateway) 等 ...

  7. 【百套源码】HTML5期末大作业 - 各类网页作业源码合集

    文章目录 持续更新文章记录 1️⃣ 个人介绍类相关源码 1.1 html实现个人简历 1.2 科技风个人简历 1.3 网站风个人简历 1.4 多种风格个人主页模板 1.5 html好看的个人简历明星版 ...

  8. Java游戏源码大礼包

    http://blog.csdn.net/cping1982/article/details/7413589 下载地址0(CSDN的,发布后忘添此地址了,麻烦有路过的帮小弟下载一次,否则就快消失||| ...

  9. 外汇交易策略MT4源码合集

    外汇市场是全球最大的金融市场, 平均每天超过1万5千亿美元的资金在其中周转 ,相当于美国所有证券市场交易额总和的30余倍,外汇市场没有具体地点,也没有中央交易所,全部通过电子网络进行7*24小时全天候 ...

最新文章

  1. 第1关:求1000以内所有的水仙花数
  2. OpenCv java 颜色空间(9)
  3. 模型参数优化(四):交叉验证、网格搜索
  4. OSPF——多区域概念及配置、ABR简介、ASBR简介、路由重分发
  5. 推荐asp.net调试工具:miniASPNETServer
  6. c mvc html 选中删除,在 MVC htmlAttribute中,如何设置被禁用_CSharp_开发99编程知识库...
  7. JAVA基础知识(13)-----Lock接口
  8. 线程概念 多线程模型
  9. SpringMvc+Mybatis +Oracle
  10. Python:科赫曲线绘制雪花
  11. python gif压缩_压缩gif的正确姿势
  12. 学习RPA-电商自动化入门①
  13. java 中int常量池_Java基础2:基本数据类型与常量池
  14. 淘宝flexible.js源码分析
  15. 矢量图和位图都是计算机记录_ _的方式,在计算机上如何区别矢量图和位图?
  16. JAVA虚拟机栈的主要特点
  17. Cadence常规通孔焊盘的创建
  18. 上网速度(网速)的计算
  19. 调用大智慧L2接口是什么原理?作用是什么?
  20. 人脸识别与美颜算法实战-基于机器学习的人脸识别

热门文章

  1. 统计学习导论 - 基于R的应用 学习笔记1
  2. 认知电子战 (1.1):传统电子战
  3. 公众号bmob_newgd.js
  4. Altium Designer-快速画封装,图解
  5. 视频点播播放器如何实现加密下载?
  6. SimpleDateFormat大写Y和小写y的区别
  7. 第五章:3ds max UV展开和BP贴图绘制(上)
  8. 4K、2K、1080p、720p、480p、240p常见视频清晰度
  9. Web开发学习总结1_网络通信
  10. 蒙特卡洛求圆周率c语言代码,蒙特卡洛法求圆周率