通过线程监控Java进程,完成attach agent

本文介绍了一个使用Java Attach API的实战案例,通过一个线程子类监控并为新启动的虚拟机加载代理程序。该程序能够检测到新增的虚拟机实例,并自动为其加载指定的代理JAR文件。


import java.io.IOException;
import java.util.List;

import com.sun.tools.attach.AgentInitializationException;
import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;

public class AttachAgent {
  // 一个运行 Attach API 的线程子类
  static class AttachThread extends Thread {

    private final List<VirtualMachineDescriptor> listBefore;

    private final String jar;

    AttachThread(String attachJar, List<VirtualMachineDescriptor> vms) {
      listBefore = vms; // 记录程序启动时的 VM 集合
      jar = attachJar;
    }

    public void run() {
      VirtualMachine vm = null;
      List<VirtualMachineDescriptor> listAfter = null;
      try {
        int count = 0;
        while (true) {
          listAfter = VirtualMachine.list();
          for (VirtualMachineDescriptor vmd : listAfter) {
            
            System.out.println("displayName:" + vmd.displayName());
            System.out.println("toString:" + vmd.toString());
            
            
            
            if (!listBefore.contains(vmd)) {
              // 如果 VM 有增加,我们就认为是被监控的 VM 启动了
              // 这时,我们开始监控这个 VM
              vm = VirtualMachine.attach(vmd);
              break;
            }
          }
          Thread.sleep(500);
          count++;
          if (null != vm || count >= 100) {
            break;
          }
        }
        vm.loadAgent(jar);
        vm.detach();
      } catch (Exception e) {

      }
    }
  }

  public static void main(String[] args) throws InterruptedException {
    new AttachThread("D:\\indigo\\eclipse\\workspace\\AttachAgent\\agent.jar", VirtualMachine.list()).start();
    
    //new AttachThread("/home/admin/attach/agent.jar", VirtualMachine.list()).start();
  }
}


转载地址:http://memory.blog.51cto.com/6054201/1174700

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值