Chciałbym monitorować następujące informacje systemowe w Javie:
- Bieżące użycie procesora ** (procent)
- Dostępna pamięć * (wolna / całkowita)
Dostępne miejsce na dysku (wolne / ogółem)
* Pamiętaj, że mam na myśli ogólną pamięć dostępną dla całego systemu, a nie tylko JVM.
Szukam rozwiązania wieloplatformowego (Linux, Mac i Windows), który nie będzie polegał na moim własnym kodzie wywołującym programy zewnętrzne lub używającym JNI. Chociaż są to realne opcje, wolałbym nie utrzymywać kodu specyficznego dla systemu operacyjnego, jeśli ktoś ma już lepsze rozwiązanie.
Jeśli dostępna jest darmowa biblioteka, która robi to w niezawodny sposób na wiele platform, byłoby świetnie (nawet jeśli wykonuje zewnętrzne wywołania lub sam kod macierzysty).
Wszelkie sugestie są mile widziane.
Aby to wyjaśnić, chciałbym uzyskać bieżące wykorzystanie procesora dla całego systemu, a nie tylko dla procesów Java.
Interfejs API SIGAR zapewnia wszystkie funkcje, których szukam w jednym pakiecie, więc jest to najlepsza jak dotąd odpowiedź na moje pytanie. Ponieważ jednak jest licencjonowany na licencji GPL, nie mogę go używać do moich pierwotnych celów (zamknięty produkt komercyjny). Możliwe, że Hyperic może licencjonować SIGAR do użytku komercyjnego, ale nie analizowałem tego. W przypadku moich projektów GPL zdecydowanie rozważę SIGAR w przyszłości.
Na moje obecne potrzeby skłaniam się w kierunku:
- Do wykorzystania procesora
OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors()
(średnie obciążenie na procesor) - Dla pamięci
OperatingSystemMXBean.getTotalPhysicalMemorySize()
iOperatingSystemMXBean.getFreePhysicalMemorySize()
- Dla miejsca na dysku
File.getTotalSpace()
iFile.getUsableSpace()
Ograniczenia:
getSystemLoadAverage()
I przestrzeń dysku metody wysyłania zapytań są dostępne tylko w języku Java 6. Ponadto niektóre funkcje JMX nie mogą być dostępne dla wszystkich platform (czyli to doniesienia, że getSystemLoadAverage()
wraca -1 w Windows).
Chociaż pierwotnie licencjonowany na licencji GPL, został zmieniony na Apache 2.0 , który ogólnie może być używany do zamkniętych produktów komercyjnych.
Odpowiedzi:
Zgodnie z tym, co wspomniałem w tym poście . Polecam korzystanie z interfejsu API SIGAR . Używam SIGAR API w jednej z moich własnych aplikacji i jest świetna. Przekonasz się, że jest stabilny, dobrze obsługiwany i pełen przydatnych przykładów. Jest open source z
GPL 2Apache 2.0. Sprawdź to. Mam wrażenie, że spełni twoje potrzeby.Za pomocą Java i Sigar API można uzyskać pamięć, procesor, dysk, obciążenie średnie, informacje i dane interfejsu sieciowego, informacje o tabeli procesów, informacje o trasie itp.
źródło
Następująco podobno dostaje procesor i pamięć RAM. Zobacz ManagementFactory po więcej szczegółów.
źródło
W JDK 1.7 możesz uzyskać użycie procesora i pamięci systemu
com.sun.management.OperatingSystemMXBean
. To jest inne niżjava.lang.management.OperatingSystemMXBean
.źródło
Działa to dla mnie idealnie bez żadnego zewnętrznego API, tylko natywna ukryta funkcja Java :)
źródło
Zobacz ten bardzo szczegółowy artykuł: http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclasstogetJVMCPUtime
Aby uzyskać procent wykorzystanego procesora, wystarczy kilka prostych obliczeń:
Uwaga: Musisz importować,
com.sun.management.OperatingSystemMXBean
a nie importowaćjava.lang.management.OperatingSystemMXBean
.źródło
W przypadku miejsca na dysku, jeśli masz Java 6, możesz użyć metod getTotalSpace i getFreeSpace w pliku. Jeśli nie używasz Java 6, myślę, że możesz użyć Apache Commons IO, aby uzyskać trochę drogi.
Obawiam się, że nie znam żadnego sposobu, aby uzyskać użycie procesora lub pamięci.
źródło
Wiele z nich jest już dostępnych za pośrednictwem JMX. W Javie 5 JMX jest wbudowany i zawierają przeglądarkę konsoli JMX z JDK.
Możesz użyć JMX do ręcznego monitorowania lub wywołać komendy JMX z Javy, jeśli potrzebujesz tych informacji we własnym czasie wykonywania.
źródło
Przyjęta odpowiedź w 2008 r. Zalecała SIGAR. Jednak w komentarzu z 2014 roku (@Alvaro) mówi:
Moja rekomendacja to użycie https://github.com/oshi/oshi
Lub odpowiedź wspomniana powyżej .
źródło
źródło
Poniższy kod to tylko Linux (może Unix), ale działa w prawdziwym projekcie.
źródło
Utwórz plik wsadowy „Pc.bat” jako, typeperf -sc 1 „\ mukit \ procesor (_ Razem) \ %% Czas procesora”
Możesz użyć klasy MProcess,
}
Następnie po manipulacji ciągiem uzyskuje się użycie procesora. Możesz użyć tego samego procesu do innych zadań.
- Muit Hasan
źródło
typeperf "\processor(_total)\% processor time"
Jeśli umieścisz go w pliku wsadowym, użyj %% zamiast%. Użyłem technet.microsoft.com/en-us/library/bb490960.aspx .