All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tsc9526.monalisa.tools.agent.AgentHotSpotVM Maven / Gradle / Ivy

There is a newer version: 2.2.0
Show newest version
package com.tsc9526.monalisa.tools.agent;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.List;

import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;
import com.sun.tools.attach.spi.AttachProvider;
import com.tsc9526.monalisa.tools.misc.MelpMisc;

public class AgentHotSpotVM {

	public void loadAgent(String agentJar, String options) {
		VirtualMachine vm = findVirtualMachine();
		if (vm == null) {
			throw new RuntimeException("Can't attach to jvm(" + System.getProperty("java.vm.name") + "). Add -javaagent:" + agentJar+ " to the commandline");
		}

		try {
			try {
				vm.loadAgent(agentJar, options);
			} finally {
				vm.detach();
			}
		} catch (Exception e) {
			throw new RuntimeException("Can't attach to jvm. Add -javaagent:" + agentJar + " to the commandline", e);
		}
	}

	private VirtualMachine findVirtualMachine() {
		VirtualMachine vm = findVirtualMachineFromList();
		if (vm == null) {
			vm = findVirtualMachineFromName();
		}
		return vm;
	}

	private VirtualMachine findVirtualMachineFromList() {
		if (VirtualMachine.list().size() > 0) {
			String pid = MelpMisc.getPid();
			try {
				return VirtualMachine.attach(pid);
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}
		return null;
	}

	private VirtualMachine findVirtualMachineFromName() {
		String jvm = System.getProperty("java.vm.name").toLowerCase();
		if (jvm.contains("hotspot") || jvm.contains("openjdk")) {
			Class vm = loadVirtualMachine();
			try {
				AttachProviderPlaceHolder holder = new AttachProviderPlaceHolder();
				Constructor vmConstructor = vm.getDeclaredConstructor(AttachProvider.class, String.class);
				vmConstructor.setAccessible(true);
				VirtualMachine newVM = vmConstructor.newInstance(holder, MelpMisc.getPid());
				return newVM;
			} catch (UnsatisfiedLinkError e) {
				throw new RuntimeException("This jre doesn't support the native library for attaching to the jvm", e);
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	private Class loadVirtualMachine() {
		String os = System.getProperty("os.name").toLowerCase();
		try {
			if (os.contains("win")) {
				return (Class) AgentHotSpotVM.class.getClassLoader().loadClass("sun.tools.attach.WindowsVirtualMachine");
			}
			if (os.contains("nix") || os.contains("nux") || os.indexOf("aix") > 0) {
				return (Class) AgentHotSpotVM.class.getClassLoader().loadClass("sun.tools.attach.LinuxVirtualMachine");
			}
			if (os.contains("mac")) {
				return (Class) AgentHotSpotVM.class.getClassLoader().loadClass("sun.tools.attach.BsdVirtualMachine");
			}
			if (os.contains("sunos") || os.contains("solaris")) {
				return (Class) AgentHotSpotVM.class.getClassLoader().loadClass("sun.tools.attach.SolarisVirtualMachine");
			}
		} catch (Exception ex) {
			throw new RuntimeException(ex);
		}
		
		throw new RuntimeException("Can't find a vm implementation for the operational system: " + os);
	}

	public static class AttachProviderPlaceHolder extends AttachProvider {

		public String name() {
			return null;
		}

		public String type() {
			return null;
		}

		public VirtualMachine attachVirtualMachine(final String id) throws AttachNotSupportedException, IOException {
			return null;
		}

		public List listVirtualMachines() {
			return null;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy