java instrument原理和Aattach API

上一次分享中有一个疑问,就是目标jvm进程和代理程序,也就是卧底程序是一起运行的.还记得吗? 通过使用如下命令:

java -javaagent:jar 文件的位置 [= 传入 premain 的参数 ]

这个势必会造成一个困惑,就是如果目标jvm进程已经先开始运行了,难不成卧底就监控不了了吗?这就好比一个小偷要去人家偷东西,难不成房子还没竣工,小偷就要去蹲点吗, 这显然是不合理的。 jdk的开发团队也意识到了这个问题, 于是他们对jdk做了以下优化,提供了agentmain函数:(之前那个函数叫premain函数)

这个函数同样有两个重载的方法:

public static void agentmain (String agentArgs, Instrumentation inst); [1]
public static void agentmain (String agentArgs); 

乍看起来和premain 函数很相似,其他使用基本相同,但是agent jar包里面的manifest文件的

key值改为Agent-Class

Manifest-Version: 1.0
Premain-Class: com.sun.btrace.agent.Main
Agent-Class: com.sun.btrace.agent.Main

不知道大家有没有注意到,如果采用后一种方法(agentmain 方式),这个函数是如何触发的呢, 人家premain函数好歹是和目标jvm进程一起启动的,

但是agentmain函数的运行时机是什么呢?

这就用到了Attach API.

Attach Api 家族的成员非常的少。 我们这里只关注2个类,”VirtualMachine” and “AttachProvider”

AttachProvider 的实现是针对不同的操作来使用的。 也就是说,如果你在windows上

你需要使用WindowsAttachProvider,在Maco上要使用MacosxAttachProvider ,使用linux 就要使用 LinuxAttachProvider 。

正如他的名字提到的, AttachProvider针对每种不同的操作系统提供(provide)一个可以访问的 VirtualMachine的示例,

接下来咱们代码说话看看如何使用AttachAPI

  1. VirtualMachine代表着一个jvm进程, 那么首先我得知道有这么个进程啊, 所以通过prstate(sloris) top(linux)等工具去查询jvm进程有哪些,选择你想要监控的进程, 通常你还可以使用ps aux 命令, 如果上面的命令你还是不清楚。 你也可以使用jdk 自带的工具jps, 这里会列表所有的java 进程。jps工具各种平台通用啊。 知道javac 和java 放在那儿吧。 他们都是一个路径下面的亲戚
  2. 既然VirtualMachine代表着一个jvm进程,那我们得想办法让这个类的实例和一个进程进行绑定吧。 好在这个类提供的这个方法,看下面的代码
VirtualMachine vm = VirtualMachine.attach("18244");
try {
vm.loadAgent("/../agent.jar");
// System.out.println(vm.getAgentProperties().get("XXX"));
} finally {
vm.detach();
}

第一行已经提示, 这里采用attach方法和一个进程进行绑定。 那个数字18244 就是咱们在第一部列出的进程号

接着,如果你想安插一个agent程序进行监控18244进程程序, 采用loadAgent方法。 这个agent怎么写, 我刚才已经提到过了。最后注意要释放这个进程,当监控工作完毕之后

看到这段代码,我们貌似并没有用到AttachProvider啊, 其实当我们调用VirtualMachine.attach方法的时候,他其实已经用到了AttachProvider了哦

// VirtualMachine vm = VirtualMachine.attach("pid");

VirtualMachine vm = null;
List providers = AttachProvider.providers();
for (AttachProvider provider : providers) {
    try {
        vm = provider.attachVirtualMachine("pid");
        break;
    } catch (Exception e) {
        // do sth. necessary
        continue;
    }
}

通过上面的代码自动的匹配平台,所以咱们就不用关心不同的操作系统选择不同类型AttachProvider了。

instrument 和AttachAPI 都是Btrace源码的学习基础, 此外还是各种监控工具的原理基础哦。

大家可以看一下btrace 的agent jar 包,里面的manifest配置,恰好说明了这一点哦

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.0
Created-By: 1.7.0_40-b43 (Oracle Corporation)
Premain-Class: com.sun.btrace.agent.Main
Agent-Class: com.sun.btrace.agent.Main
                                                    杏树林研发 韩健
时间: 2024-08-14 00:01:21

java instrument原理和Aattach API的相关文章

Mybatis插件原理和PageHelper结合实战分页插件(七)

今天和大家分享下mybatis的一个分页插件PageHelper,在讲解PageHelper之前我们需要先了解下mybatis的插件原理.PageHelper 的官方网站:https://github.com/pagehelper/Mybatis-PageHelper 一.Plugin接口 mybatis定义了一个插件接口org.apache.ibatis.plugin.Interceptor,任何自定义插件都需要实现这个接口PageHelper就实现了改接口 package org.apach

计算机网络原理和OSI模型与TCP模型

计算机网络原理和OSI模型与TCP模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.计算机网络的概述 1.计算机网络的定义 计算机网络是一组自治计算机的互连的集合 2.计算机网络的基本功能 a.资源共享 b.分布式处理与负载均衡 c.综合信息服务 3.计算机网络的演进 4.按照地域范围 a>.LAN(Local Area Network) 通常指几千米以内的,可以通过某种介质互联的计算机.打印机.modem或其他设备的集合 MAN(Metropolitan Area N

(转)详解LVS负载均衡之三种工作模型原理和10种调度算法

前言:最近在为我们的产品在做高可用,一边搭环境,一边了解相关知识,搜到这篇博客,质量不错,表述清晰,于是转载过来学习. 标签:详解LVS负载均衡之三种工作模型原理和10种调度算法 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://linuxnx.blog.51cto.com/6676498/1195379 LVS负载均衡原理和算法详解    Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大

iOS开发UI篇—程序启动原理和UIApplication

iOS开发UI篇-程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示. (3)通过[UIApplicationsharedApplication]可以获得这个单例对象 (4) 一个iOS程序启动后创建的第一个对

Java中常用的字符串API

Java中常用的字符串API 这些API都封装在了 import java.lang; (默认导入无需手工导入) 字符串.length() 返回字符串的长度 字符串1.equals(字符串2) 判断两个字符串内容是否一致(不能用==) 字符串1.equalsIgnoreCase(字符串2) 判断两个字符串内容是否一致(不区分大小写) 字符串.toLowerCase() 返回小写字符串 字符串.toUpperCase() 返回大写字符串 字符串1.concat(字符串2) 返回字符串1接上字符串2

加密、解密原理和openssl自建CA过程详解

一.加密和解密相关知识简介 1.信息安全标准 NIST(National Institute of Standards and Technology)美国国家标准与技术研究院,制定了网络信息安全与保密的三个要素: 保密性(confidentiality):信息不泄露给非授权用户.实体或过程,或供其利用的特性.(一般包括数据保密性.隐私性.) 完整性(Integrity):数据未经授权不能进行改变的特性.即信息在存储或传输过程中保持不被修改.不被破坏和丢失的特性.(一般包括数据完整性.系统完整性.

java 线程 原子类相关操作示例 thinking in java4 目录21.3.4

java 线程  原子类相关操作示例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; /** * 原子类,

外贸开发,用java调用速卖通api第一步,token的获取。

第一步 定义速卖通api的常量 public String client_id; public String client_key; public String site; 第二步 获取登陆的uRL /** * getloginurl * @param redirect_uri * @return */ public String GetLoginUrl(String redirect_uri) { String param = (new StringBuilder("client_id=&qu

java se 6(jdk1.6) API手册下载地址

http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/index.html?org/w3c/dom/Document.html