[英]Stop scheduled task in JavaAgent
我試圖制作簡單的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?
使用Timer time = new Timer(true);
這將使TimerTasks
成為守護進程。 當主線程退出時,守護程序線程完成。 更多信息在這里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.