文章插图
监控的基本流程
文章插图
基本流程
采集数据的方式
- 有代码侵入(比如:Cat);
- 无代码侵入(比如:Skywalking、Pinpoint等);
使用 JVMTI 我们能做两件事:
- 在虚拟机启动时,即在main方法之前可以做一些事情(通过 Java agent);
- 在虚拟机启动之后,即在main方法之后可以做一些事情(通过 Attach API);
Java agent的使用
通过 java.lang.instrument.Instrumentation 来实现 。1.编写premain函数
public static void premain(String agentArgs, Instrumentation inst); [1]public static void premain(String agentArgs); [2]其中,[1] 的优先级比 [2] 高,将会被优先执行([1] 和 [2] 同时存在时,[2] 被忽略) 。
在这个 premain 函数中,开发者可以进行对类的各种操作 。
agentArgs 是 premain 函数得到的程序参数,随同 “– javaagent”一起传入 。与 main 函数不同的是,这个参数是一个字符串而不是一个字符串数组,如果程序参数有多个,程序将自行解析这个字符串 。
Inst 是一个 java.lang.instrument.Instrumentation 的实例,由 JVM 自动传入 。java.lang.instrument.Instrumentation 是 instrument 包中定义的一个接口,也是这个包的核心部分,集中了其中几乎所有的功能方法,例如类定义的转换和操作等等 。
2.jar文件打包
将这个 Java 类打包成一个 jar 文件,并在其中的 manifest 属性当中加入” Premain-Class”来指定步骤 1 当中编写的那个带有 premain 的 Java 类 。(可能还需要指定其他属性以开启更多功能),如下:
META_INF/MANIFEST.MF文件内容:
Manifest-Version: 1.0 Premain-Class: Premain3.运行
用如下方式运行带有 Instrumentation 的 Java 程序:
java -javaagent:jar 文件的位置 [= 传入 premain 的参数 ]虚拟机启动后的动态instrument
通过 java.lang.instrument.Instrumentation 和Attach API来实现,Attach API在com.sun.tools.attach包里 。1.编写agentmain函数
public static void agentmain (String agentArgs, Instrumentation inst); [1] public static void agentmain (String agentArgs); [2]同样,[1] 的优先级比 [2] 高,将会被优先执行 。
2.打包
在.MF文件中增加Agent-Class属性
Agent-Class: AgentMain3.运行
文章插图
代码截图
Java应用的监控与诊断工具
- jconsole, jvisualvm, jprofiler 等
- MyPerf4J (https://github.com/LinShunKang/MyPerf4J)
- BTrace (https://github.com/btraceio/btrace)
- Arthas (https://github.com/alibaba/arthas)
- Bistoury (https://github.com/qunarcorp/bistoury)
推荐阅读
- 基于 Vue3.0+Electron 搭建桌面端应用
- 阿里云物联网应用开发工具IoT Studio用户数突破10万 低代码开发获追捧
- JavaScript两个快速调试的技巧
- 给大家谈谈APP应用开发的几个阶段
- 20个常用的JavaScript简写技巧
- Docker一个优秀的应用容器
- 开源监控系统wgcloud-v3.3.0发布
- 21个最佳Flutter软件包,用于简化Flutter应用开发
- Java开发中常用的几种Git工作流
- 开发APP应用时哪些误区是不能触碰的