2014-10-09 50 views
1

我發現了Java API連接可以加載javaagent如下面的代碼:的Java VirtualMachine.loadAgent只裝劑在一次

import com.sun.tools.attach.VirtualMachine; 
import com.sun.tools.attach.VirtualMachineDescriptor; 
import java.util.List; 

public class ListVM{ 
    public static void main(String[] args){ 
     List<VirtualMachineDescriptor> vmList = VirtualMachine.list(); 
     for(VirtualMachineDescriptor vm : vmList){ 
     System.out.println("name: " + vm.displayName() + " id :" + vm.id()); 
     try{ 
      VirtualMachine vm0 = VirtualMachine.attach(vm.id()); 
      // load agent, agnet class's agentmain will be invoked. 
      vm0.loadAgent("/root/tmp/ChinaAgent.jar"); 
      System.out.println("Load agent done."); 
      vm0.detach(); 
     }catch(Exception e) { 
      System.out.println("exception : " + e.getMessage()); 
     } 
     } 
    } 
} 

聲明:vm0.loadAgent("/root/tmp/ChinaAgent.jar");它加載代理jar文件。

但客戶端的代碼將只運行一次,

所以我猜這個代理JAR加載只有一次,這意味着在JVM防止加載代理多次。

這是事實嗎?爲什麼?

希望能有一些代碼來證明它!

謝謝!

回答

2

當您致電loadAgent時,代理jar運行一次。調用JAR清單中由Agent-Class屬性指定的代理類的agentmain方法。

這個類實際上是加載一次,除非你已經做了一些優化來卸載類。因此,如果您在同一個jar中多次調用loadAgent,則類將不會被重新加載,但可能會多次調用Agent_OnAttach(agentmain)。 實際上它是平臺特定的並且取決於JVM實現。

loadAgent方法調用loadAgentLibrary它調用Agent_OnAttach這是平臺特定

參考文獻: