package de.codecentric.performance.agent.allocation; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.instrument.Instrumentation; import java.lang.management.ManagementFactory; import java.util.concurrent.TimeUnit; import javax.management.MBeanServer; import javax.management.ObjectName; import de.codecentric.performance.agent.allocation.mbean.Agent; /** * Class registered as premain hook, will add a ClassFileTransformer and register an MBean for controlling the agent. */ public class AllocationProfilingAgent { public static void premain(String agentArgs, Instrumentation inst) { String prefix = agentArgs; if (prefix == null || prefix.length() == 0) { AgentLogger.log("Agent failed to start: Please provide a package prefix to filter."); return; } // accepts both . and / notation, but will convert dots to slashes prefix = prefix.replace(".", "/"); if (!prefix.contains("/")) { AgentLogger.log("Agent failed to start: Please provide at least one package level prefix to filter."); return; } registerMBean(); inst.addTransformer(new AllocationTrackerClassFileTransformer(prefix)); } /* * Starts a new thread which will try to connect to the Platform Mbean Server. */ private static void registerMBean() { Thread thread = new Thread() { @Override public void run() { try { // retry up to a maximum of 10 minutes int retryLimit = 60; MBeanServer mbs = null; while (mbs == null) { if (retryLimit-- == 0) { AgentLogger.log("Could not register Agent MBean in 10 minutes."); return; } TimeUnit.SECONDS.sleep(10); mbs = ManagementFactory.getPlatformMBeanServer(); } mbs.registerMBean(new Agent(), new ObjectName("de.codecentric:type=Agent")); AgentLogger.log("Registered Agent MBean."); } catch (Exception e) { AgentLogger.log("Could not register Agent MBean. Exception:"); StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); AgentLogger.log(sw.toString()); } } }; thread.start(); } }