C'è un modo per ottenere il carico della CPU corrente in Java senza utilizzare JNI?CPU caricata da Java
risposta
Utilizzare ManagementFactory
per ottenere un OperatingSystemMXBean
e chiamare getSystemLoadAverage()
su di esso.
Su Linux è possibile leggere il file/proc/loadavg, dove i primi tre valori rappresentano le medie del carico. Probabilmente per Windows è necessario attenersi a JNI.
Ciò comporta JNI ma esiste una libreria GPL di Hyperic denominata Sigar che fornisce queste informazioni per tutte le principali piattaforme, oltre a una serie di altre statistiche dipendenti dal sistema operativo come l'utilizzo del disco. Ha funzionato alla grande per noi.
Se si utilizza il JRockit JVM è possibile utilizzare JMAPI. Funziona con JDK 1.4, 1.5 e 1.6.
System.out.println("Total CPU-usage:" + JVMFactory.getJVM().getMachine().getCPULoad());
System.out.println("Total JVM-load :" + JVMFactory.getJVM().getJVMLoad());
for(Iterator it = JVMFactory.getJVM().getMachine().getCPUs().iterator(); it.hasNext();)
{
CPU cpu = (CPU)it.next();
System.out.println("CPU Description: " + cpu.getDescription());
System.out.println("CPU Clock Frequency: " + cpu.getClockFrequency());
System.out.println("CPU Load: " + cpu.getLoad());
System.out.println();
}
getSystemLoadAverage() dà apprezzi di più di 1 minuto di tempo (aggiornata ogni secondo) e dà il valore per il sistema operativo in generale. Più panoramica in tempo reale dovrebbe essere eseguita monitorando ogni thread separatamente. Importante è anche notare l'intervallo di aggiornamento del monitoraggio - più spesso si controlla il valore, più precisi è in un dato momento e se lo si fa ogni millisecondo, è in genere 0 o 100 (o più a seconda di quante CPU ci sono). Ma se permettiamo il lasso di tempo (per esempio 1 secondo), otteniamo lo sviluppo medio in questo periodo di tempo e otteniamo risultati più informativi. Inoltre, è importante notare che è altamente improbabile che solo un thread occupi più di una CPU (core).
seguito attuazione permette di utilizzare 3 metodi:
- getTotalUsage() - Carico totale da tutti i fili in JVM
- getAvarageUsagePerCPU() - Carico Avarage per CPU (core)
getUsageByThread (Discussione t) - Carico totale per thread specificato
import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.lang.management.ThreadMXBean; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class MonitoringThread extends Thread { private long refreshInterval; private boolean stopped; private Map<Long, ThreadTime> threadTimeMap = new HashMap<Long, ThreadTime>(); private ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); private OperatingSystemMXBean opBean = ManagementFactory.getOperatingSystemMXBean(); public MonitoringThread(long refreshInterval) { this.refreshInterval = refreshInterval; setName("MonitoringThread"); start(); } @Override public void run() { while(!stopped) { Set<Long> mappedIds; synchronized (threadTimeMap) { mappedIds = new HashSet<Long>(threadTimeMap.keySet()); } long[] allThreadIds = threadBean.getAllThreadIds(); removeDeadThreads(mappedIds, allThreadIds); mapNewThreads(allThreadIds); Collection<ThreadTime> values; synchronized (threadTimeMap) { values = new HashSet<ThreadTime>(threadTimeMap.values()); } for (ThreadTime threadTime : values) { synchronized (threadTime) { threadTime.setCurrent(threadBean.getThreadCpuTime(threadTime.getId())); } } try { Thread.sleep(refreshInterval); } catch (InterruptedException e) { throw new RuntimeException(e); } for (ThreadTime threadTime : values) { synchronized (threadTime) { threadTime.setLast(threadTime.getCurrent()); } } } } private void mapNewThreads(long[] allThreadIds) { for (long id : allThreadIds) { synchronized (threadTimeMap) { if(!threadTimeMap.containsKey(id)) threadTimeMap.put(id, new ThreadTime(id)); } } } private void removeDeadThreads(Set<Long> mappedIds, long[] allThreadIds) { outer: for (long id1 : mappedIds) { for (long id2 : allThreadIds) { if(id1 == id2) continue outer; } synchronized (threadTimeMap) { threadTimeMap.remove(id1); } } } public void stopMonitor() { this.stopped = true; } public double getTotalUsage() { Collection<ThreadTime> values; synchronized (threadTimeMap) { values = new HashSet<ThreadTime>(threadTimeMap.values()); } double usage = 0D; for (ThreadTime threadTime : values) { synchronized (threadTime) { usage += (threadTime.getCurrent() - threadTime.getLast())/(refreshInterval * 10000); } } return usage; } public double getAvarageUsagePerCPU() { return getTotalUsage()/opBean.getAvailableProcessors(); } public double getUsageByThread(Thread t) { ThreadTime info; synchronized (threadTimeMap) { info = threadTimeMap.get(t.getId()); } double usage = 0D; if(info != null) { synchronized (info) { usage = (info.getCurrent() - info.getLast())/(refreshInterval * 10000); } } return usage; } static class ThreadTime { private long id; private long last; private long current; public ThreadTime(long id) { this.id = id; } public long getId() { return id; } public long getLast() { return last; } public void setLast(long last) { this.last = last; } public long getCurrent() { return current; } public void setCurrent(long current) { this.current = current; } } }
- 1. CPU utilizzata da Processo
- 2. java con CPU al 100%
- 3. Java ridurre l'utilizzo della CPU
- 4. Tempo di esecuzione della CPU in Java
- 5. Impostazione java per utilizzare una cpu
- 6. Utilizzo elevato della CPU nell'applicazione java - perché?
- 7. Java - relazione tra thread e CPU
- 8. Java: Matcher.find utilizzando elevato utilizzo della CPU
- 9. Multithreading Java nel carico della CPU
- 10. Come scaricare una classe già caricata in Java?
- 11. WebRTC - riduzione della CPU, impostazioni da perfezionare
- 12. Come posso verificare che un'applet java sia caricata usando javascript?
- 13. cpu vs gpu - quando cpu è migliore
- 14. Rileva quando viene caricata un'applet
- 15. Utilizzo CPU per thread
- 16. Java VisualVM Utilizzo della CPU e affinità del processore
- 17. Perché la deserializzazione di Java è legata alla CPU?
- 18. Quanti core cpu possono utilizzare un singolo processo Java?
- 19. Come ottenere la percentuale di utilizzo della CPU del sistema operativo da java
- 20. iOS: la foto caricata su Facebook non viene sempre caricata
- 21. La proprietà Lazy Load caricata è stata caricata in EF6
- 22. Compilatore C2 saturazione CPU all'avvio
- 23. gdb: interruzione nella libreria condivisa caricata da python
- 24. Swift: Come chiamare una funzione C caricata da un dylib
- 25. Proprietà IBOutlet nil dopo la visualizzazione personalizzata caricata da xib
- 26. Posta caricata Video
- 27. Libreria JavaHl incompatibile caricata
- 28. L'applet Java non verrà caricata in IE dopo l'aggiornamento a Java 8
- 29. Come impostare l'affinità core della CPU di un thread Java?
- 30. Monitorare l'utilizzo della cpu per thread in java?
Sono sicuro che questo non funziona su Windows XP. –