Runtime bzw. RAM-Auslastung eines Prozesses

Ich bins wiedereinmal 🙂

Zurzeit mache ich ein kleines Monitoring-Programm in Java. Jetzt möchte ich gerne die RAM-Auslastung eines durch Runtime.getRuntime().exec("java -jar test.jar"); gestarteten Prozesses. Ich weiß das man das mit Runtime.getFreeMemory(); und so machen kann, jedoch wie kann man auf die Runtime eines Java-Prozesses zugreift?

Ist das überhaupt möglich?

Gruß PNGamingPower
 
Zuletzt bearbeitet:
So, ich hab nun noch etwas gegoogelt und habe herausgefunden das ich mit der ManagementFactory und ein paar Tricks die CPU-Auslastung ausrechnen kann. Funktioniert ganz gut. Jedoch wie kann ich auf die ManagemnetFactory eines Java Prozesses ,den ich gestartet und als Variable
Java:
Process p;
vorliegen habe, zugreifen?
 
Hier ist der Code mit dem ich es berechne (Er ist nicht von mir, finde den Link aber nicht!):

Java:
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;

public class PerformanceMonitor {
	private static int availableProcessors = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
	private static long lastSystemTime = 0;
	private static long lastProcessCpuTime = 0;

	public static synchronized double getCpuUsage() {
		if (lastSystemTime == 0) {
			baselineCounters();
			return 0;
		}

		OperatingSystemMXBean osm = ManagementFactory.getOperatingSystemMXBean();
		long systemTime = System.nanoTime();
		long processCpuTime = 0;

		if (osm instanceof OperatingSystemMXBean) {
			processCpuTime = ((com.sun.management.OperatingSystemMXBean) osm).getProcessCpuTime();
		}

		double cpuUsage = (double) (processCpuTime - lastProcessCpuTime) / (systemTime - lastSystemTime);

		lastSystemTime = systemTime;
		lastProcessCpuTime = processCpuTime;

		return cpuUsage / availableProcessors;
	}

	private static void baselineCounters() {
		lastSystemTime = System.nanoTime();
		OperatingSystemMXBean osm = ManagementFactory.getOperatingSystemMXBean();
		if (osm instanceof OperatingSystemMXBean) {
			lastProcessCpuTime = ((com.sun.management.OperatingSystemMXBean) osm).getProcessCpuTime();
		}
	}
}
Falls du Eclipse verwendest, musst du höchstwahrscheinlich die JRE-Library unter Preferences neu hinzufügen (also löschen und neu dazu machen), da du sonst dauernd einen "access restriction"-Error kriegst.

Ich habe das mal mit dem Taskmanager nebenan überprüft und der CPU-Wert war immer ungefähr der selbe.
 

Zurück
Oben