关键字高亮脚本 JAVA服务化系统中那些你不得不知的脚本与命令...
此脚本利用 Linux 命令 nc 检查 HTTP 请求参数、请求头和请求体等信息,常常用于调试基于 HTTP 协议的服务调用,如果一次 HTTP 调用没有的达到预期的效果,首先检查传递的参数是否正确,这包括请求参数、请求头、请求体等信息,这种场景正式此脚本的用武之地。
命令格式:
使用示例:
示例输出:
脚本源码:
2.6 show-mysql-qps
此脚本可以用于快速查看 Mysql 实例的负载情况,包括 QPS、TPS、提交数、回滚数、并发线程、执行线程等。
命令格式:
使用示例:
示例输出:
脚本源码:
Java虚拟机相关的命令
本节介绍 Java 世界里那些有用的虚拟机命令,但并不会介绍所有的 JDK 自带的工具命令关键字高亮脚本,而是结合实践给读者介绍那些最常用最重要的 Java 虚拟机相关的命令,以及一些开源的 Java 虚拟机工具,目的是帮助大家在现实中解决问题。
3.1 jad
jad 反编译工具可以将字节码的二进制类反编译回 Java 源代码,常常用于遇到问题但是无法在源代码中定位的场景,通过反编译字节码可以分析程序事实上执行的流程,从而定位深层次的问题。
由于历史原因或者其他原因,有些时候项目依赖了没有源代码的 jar 包,如果出现问题需要定位,那么 jad 命令可是个小倚天剑。
如果不习惯使用命令行,可以下载界面版本 jd-gui,可以一次反编译一个 JAR 包,并在类之间有简单的导航操作。
如果开发者对字节码进行了混淆,反编译的源代码将很难读懂,混淆的代码只能通过混淆后给出的摘要文件进行分析,这种场景下使用反编译工具作用不大。
使用示例:
示例输出:
3.2 btrace
java 应用服务在生产环境中可能会出现各种各样的问题,有些问题在找到根源原因之前看似很“不可思议”,有些时候并没有产生异常或者错误消息,这时我们无法根据已有的日志来定位问题,那么我们需要更多的信息卡盟,例如:参数、返回值、程序逻辑判断、循环次数等信息,来追踪问题。
如果临时增加日志,需要重新上线,成本较高,使用远程调试又会影响线上流量甚至导致客户程序超时,这个时候 btrace 应运而生,btrace 可以动态地跟踪 java 运行时程序,将定制化的跟踪字节码切面注入到运行类中,对运行代码无侵入,根据官方信息判断对性能上的影响也可以忽略不计。
下面介绍 btrace 的使用方法:
命令格式:
参数解析:
在运行命令之前,我们需要编写 btrace 的跟踪脚本:
这个跟踪脚本对业务代码的方法进行拦截,并打印方法执行时间:
使用示例:
当 AdminController 类的 sayHello 被调用的时候关键字高亮脚本,控制台就会打印方法执行时间,这对定位线上的棘手问题有非常大的帮助。
3.3 jmap
生产中 java 应用服务发生 OutOfMemoryError 那是家常便饭,发生了 OutOfMemoryError 或者发现内存不足报警,我们经常需要找到是什么原因造成的,要找到内存都去哪儿了,jmap 在这个场景是用来定位问题的主要工具,它主要用来查看 Java 进程内存的使用情况。
jmap 是 JDK 自带的监控工具,在 JDK 的根目录里可以找到。
使用示例1:
按照占用空间大小打印程序中类的列表,从这个列表中可以分析哪些类占用了比较多的内存,再结合代码找到问题的所在。
示例输出:
使用示例2:
按照占用空间大小打印程序中加载的动态链接库的列表。其实,Java 进程在操作系统中会加载多个动态链接库,Java 进程本身和动态链接库都会在其占用的虚拟地址空间上分配内存,Java 堆和栈等内存空间分配在 Java 进程本身,Java 直接内存会分配在 Java 进程堆内存外或者依赖的动态链接库上。