2012-12-25 2 views
1


간단한 Java 프로파일 러를 만들고 javaagent를 사용하여 메모리 사용을 모니터하려고합니다.JavaAgent에서 예약 된 작업을 중지하십시오.

import java.lang.instrument.ClassFileTransformer; 
import java.lang.instrument.IllegalClassFormatException; 
import java.lang.instrument.Instrumentation; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.security.ProtectionDomain; 
import java.util.ArrayList; 
import java.util.Timer; 
import java.lang.management.ManagementFactory; 
import java.lang.management.MemoryPoolMXBean; 
import java.lang.management.MemoryUsage; 
import java.util.Iterator; 
import java.util.List; 
import java.util.TimerTask; 

public class Transformer implements ClassFileTransformer { 

    private Notifier notifier; 
    private Instrumentation inst; 
    private ArrayList<Class> loadedClasses; 


    public Transformer(Instrumentation inst) { 
     this.inst = inst; 
     loadedClasses = new ArrayList<Class>(); 
     initNotifier(); 
     Timer time = new Timer(); 
     MemoryMonitor mm = new MemoryMonitor(notifier); 
     time.schedule(mm, 0, 1000); 
    } 

    public static void premain(String args, Instrumentation inst) { 
     inst.addTransformer(new Transformer(inst)); 
    } 

    private void initNotifier() { 
     if (notifier != null) return; 
     try { 
      Registry registry = LocateRegistry.getRegistry(Const.registryPort); 
      notifier = (Notifier) registry.lookup(Const.stubName); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    }  
} 

public class MemoryMonitor extends TimerTask { 

    private Notifier notifier; 

    public MemoryMonitor(Notifier notifier) { 
     this.notifier = notifier; 
    } 

    @Override 
    public void run() { 
     try { 
      notifier.memoryUsed(monitorMemory()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    private double monitorMemory() { 
     List memBeans = ManagementFactory.getMemoryPoolMXBeans(); 
     double used = 0; 
     for (Iterator i = memBeans.iterator(); i.hasNext();) { 

      MemoryPoolMXBean mpool = (MemoryPoolMXBean) i.next(); 
      MemoryUsage usage = mpool.getUsage(); 
      used = usage.getUsed()/1000; 
     } 
     return used; 
    } 
} 

이 코드는 잘 작동하고 프로파일 링 도구 메모리 사용량에 대한 데이터를 전송합니다 이 내 javaagent의 실현의 일부입니다. 하지만 javaagent는 애플리케이션 실행이 끝난 후에 멈추지 않습니다.
누구든지 응용 프로그램 실행 종료 후 javaagent를 중지하는 방법을 알고 있습니까?

답변

3

Timer time = new Timer(true);을 사용하면 TimerTasks이 데몬이됩니다. 메인 스레드가 종료되면 데몬 스레드가 완료됩니다. 자세한 정보 here

+0

대단히 고마워요! –

관련 문제