2013-08-05 3 views
2

Java 에이전트 jar 파일을 작성했습니다 (명령 행에서 완벽하게 작동합니다). 다음으로이 에이전트를 j2ee 서버의 실행중인 JVM에 연결하고 싶습니다. 그래서 나는 코드를 사용 :Java Agent jars를 코드에 동적으로 추가 한 후 Java Agent jars를 언로드하는 방법은 무엇입니까? Java 계측

public static void loadAgent() { 

    System.out.println("dynamically loading javaagent"); 
    String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName(); 
    int p = nameOfRunningVM.indexOf('@'); 
    String pid = nameOfRunningVM.substring(0, p); 

    try { 
     VirtualMachine vm = VirtualMachine.attach(pid); 
     String jarFilePath = vm.getSystemProperties().getProperty("java.home")+File.separator+"lib"+File.separator+"test-agent-7.jar";    
     vm.loadAgent(jarFilePath, ""); 
     vm.detach(); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

편집 :이 지금 일이고, 나는 호출되는 변압기를 볼 수 있어요. 나는 또한 변압기를 제거하고 변압기를 디버깅 할 수있었습니다.

내 질문은 :

  • 어떻게 내가이 자바 에이전트 항아리를 언로드 않는 한 번 완성은?
  • JVM을 종료/재시작하는 유일한 방법은 무엇입니까?
  • 항아리가 메모리에 남아 있으면 영향을 줍니까? 에이전트를로드하는 경우

    , 당신은 클래스를로드 :

+0

@Tal 문제를 해결 했습니까? –

+0

불행히도 ... 에이전트 jar가로드되어 있습니다 .. – Tal

답변

2

글쎄, 몇 가지 고려해야있다. 관련 클래스 로더가 Java VM의 메모리 내에있는 한 관련 클래스는로드 된 상태로 유지됩니다. 나는 너를 쉽게 막거나 회피 할 수 있다고 생각하지 않는다. 그러나 이것은 에이전트를로드하여 작은 메모리 오버 헤드로만 이루어져야합니다.

약간의 연구 결과에 따르면 에이전트는 SystemClassLoader에 의해로드되므로 해당 클래스를 언로드하는 것은 불가능합니다.

시작 에이전트는 VM 시작

후 구현에 따라서는, VM의 개시 후에 언젠가 를 에이전트를 시작하는 메커니즘을 제공 할 수 있습니다. 이것이 어떻게 시작되는지에 대한 세부 사항은 구현에 따라 다르지만 일반적으로 응용 프로그램은 이미 이고 시작된 메소드가 이미 호출되었습니다. VM이 을 시작한 후에 구현이 구현을 지원하는 경우 다음이 적용됩니다. 에이전트 JAR의 매니페스트는 에이전트 클래스 속성을 포함해야합니다. 이 속성의 값은 에이전트 클래스의 이름입니다. 에이전트 클래스는 public static agentmain 메소드를 구현해야합니다. 시스템 클래스 로더 (ClassLoader.getSystemClassLoader)는 에이전트 JAR 파일을 시스템 클래스 경로에 추가하는 메커니즘을 지원해야합니다. Link to source

그러나 영향을 줄 수있는 것은 상담원이 수행하는 작업입니다.

해당 에이전트를 종료 하시겠습니까? 종료 방법을 제공하십시오.

외부에서 에이전트를 중지하려면이 에이전트가 에이전트를 종료하는 JMXBean을 제공 할 수 있습니다.

이 방법을 사용하면 Instrumentation 인터페이스에서 변환기를 제거하거나 Java VM 내부에서 에이전트가 수행중인 다른 작업을 중지 할 수 있습니다 (객체가 가비지 수집되도록이 참조와 리소스를 해제하십시오).

달성하려는 목표에 대해 좀 더 구체적인 내용은 없지만보다 적합한 답변을 제공하는 것이 어렵습니다.

관련 문제