Wie erhalte ich die Kennung meines Java-Prozesses?
Ich weiß, dass es mehrere plattformabhängige Hacks gibt, aber ich würde eine allgemeinere Lösung vorziehen.
Wie erhalte ich die Kennung meines Java-Prozesses?
Ich weiß, dass es mehrere plattformabhängige Hacks gibt, aber ich würde eine allgemeinere Lösung vorziehen.
Der Vollständigkeit halber gibt es einen Wrapper in Spring Boot に対して
String jvmName = ManagementFactory.getRuntimeMXBean().getName();
return jvmName.split("@")[0];
Lösung. Wird eine ganze Zahl benötigt, so kann diese zum Einzeiler addiert werden:
int pid = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);
Wenn jemand bereits Spring Boot verwendet, könnte er/sie org.springframework.boot.ApplicationPid
ApplicationPid pid = new ApplicationPid();
pid.toString();
Die Methode toString() gibt die pid oder '???' aus.
Die Vorbehalte gegen die Verwendung der ManagementFactory wurden bereits in anderen Antworten erörtert.
Dies ist der Code, den JConsole und möglicherweise auch jps und VisualVM verwenden. Er verwendet Klassen aus sun.jvmstat.monitor.*
Paket, von tool.jar
.
package my.code.a003.process;
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;
public class GetOwnPid {
public static void main(String[] args) {
new GetOwnPid().run();
}
public void run() {
System.out.println(getPid(this.getClass()));
}
public Integer getPid(Class<?> mainClass) {
MonitoredHost monitoredHost;
Set<Integer> activeVmPids;
try {
monitoredHost = MonitoredHost.getMonitoredHost(new HostIdentifier((String) null));
activeVmPids = monitoredHost.activeVms();
MonitoredVm mvm = null;
for (Integer vmPid : activeVmPids) {
try {
mvm = monitoredHost.getMonitoredVm(new VmIdentifier(vmPid.toString()));
String mvmMainClass = MonitoredVmUtil.mainClass(mvm, true);
if (mainClass.getName().equals(mvmMainClass)) {
return vmPid;
}
} finally {
if (mvm != null) {
mvm.detach();
}
}
}
} catch (java.net.URISyntaxException e) {
throw new InternalError(e.getMessage());
} catch (MonitorException e) {
throw new InternalError(e.getMessage());
}
return null;
}
}
Es gibt nur wenige Haken:
tool.jar
ist eine Bibliothek, die mit Oracle JDK, aber nicht mit JRE verteilt wird!tool.jar
aus dem Maven Repo; die Konfiguration mit Maven ist ein wenig kniffligtool.jar
enthält wahrscheinlich plattformabhängigen (nativen?) Code und ist daher nicht leicht verteilbarUPDATE: Ich habe soeben doppelt überprüft, dass JPS diesen Weg nutzt, nämlich die Jvmstat-Bibliothek (Teil von tool.jar). Es besteht also keine Notwendigkeit, JPS als externen Prozess aufzurufen, sondern die Jvmstat-Bibliothek direkt aufzurufen, wie mein Beispiel zeigt. Sie können auf diese Weise auch eine Liste aller JVMs erhalten, die auf localhost laufen. Siehe JPS Quellcode :
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.