Si necesita simplemente lista de funcionamiento JVM con los PID Esto funciona para mí:
package my.code.z025.util;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import sun.jvmstat.monitor.HostIdentifier;
import sun.jvmstat.monitor.MonitorException;
import sun.jvmstat.monitor.MonitoredHost;
import sun.jvmstat.monitor.MonitoredVm;
import sun.jvmstat.monitor.MonitoredVmUtil;
import sun.jvmstat.monitor.VmIdentifier;
/**
* Get list of all local active JVMs
*/
public class ActiveJavaVirtualMachineExplorer {
/**
* Represents successfully captured active java virtual machine
*/
public static class ActiveVm {
private int pid;
private String name;
... shortened ...
}
/**
* Represents unsuccessfully captured active java virtual machine, a failure.
* Keep cause exception.
*/
public static class FailedActiveVm extends ActiveVm {
private Exception cause;
... shortened ...
}
/**
* Get list of all local active JVMs.
* <p>
* Returns something like:
* ActiveVm [pid=7992, name=my.code.z025.util.launch.RunHttpServer]
* ActiveVm [pid=6972, name=]
* ActiveVm [pid=8188, name=my.code.z025.util.launch.RunCodeServer]
* ActiveVm [pid=4532, name=org.eclipse.jdt.internal.junit.runner.RemoteTestRunner]
* The pid=6972 must be Eclipse. So this approach is not water tight.
*/
public static List<ActiveVm> getActiveLocalVms() {
List<ActiveVm> result = new LinkedList<ActiveVm>();
MonitoredHost monitoredHost;
Set<Integer> activeVmPids;
try {
monitoredHost = MonitoredHost.getMonitoredHost(new HostIdentifier((String) null));
activeVmPids = monitoredHost.activeVms();
for (Integer vmPid : activeVmPids) {
try {
MonitoredVm mvm = monitoredHost.getMonitoredVm(new VmIdentifier(vmPid.toString()));
result.add(new ActiveVm(vmPid.intValue(), MonitoredVmUtil.mainClass(mvm, true)));
mvm.detach();
} catch (Exception e) {
result.add(new FailedActiveVm(vmPid.intValue(), e));
}
}
return result;
} catch (java.net.URISyntaxException e) {
throw new InternalError(e.getMessage());
} catch (MonitorException e) {
throw new InternalError(e.getMessage());
}
}
}
Aplicación no tiene que ejecutarse con ningún parámetro de línea de comando especial para ser detectable de esta manera. No es necesario activar JMX.
No todas las aplicaciones JVM funcionan bien. Para Eclipse veo solo PID, pero no nombre de clase o línea de comando.
Tiene que agregar tool.jar
a su classpath, contiene los paquetes sun.jvmstat.*
. El tool.jar
es parte de JDK. Con alguna variante de JDK/OS está en classpath por defecto, con algunos tienes que agregarlo. Hacerlo con las dependencias de Maven es un poco complicado, se requiere systemPath.
Si quiere más de lo que acaba de enumerar, consulte el enlace de Paŭlo Ebermann - Monitoring and Management Using the JMX API.
VirtualMachine vm = VirtualMachine.attach(pid);
Donde el PID se obtiene de la lista. Luego inserte su Agente en (insospechada) Java (o cualquier aplicación JVM).
vm.loadAgent(agentJarLibraryFullPath);
Luego comuníquese con su agente a través de JMXConnector. Su agente puede recopilar todas las estadísticas para usted. Yo personalmente no lo he intentado. Incluso puede instrumentar (modificar) el código de tiempo de ejecución de esta manera. Los perfiladores usan eso.
VisualVM puede hacerlo así que debe haber una manera, aunque probablemente no es uno fácil . – biziclop