Obecnie tworzę aplikację Java, która może być uruchamiana na wielu różnych platformach, ale przede wszystkim w wersjach Solaris, Linux i Windows.
Czy ktoś był w stanie z powodzeniem wyodrębnić informacje, takie jak bieżące używane miejsce na dysku, wykorzystanie procesora i pamięci w podstawowym systemie operacyjnym? A co z konsumowaniem samej aplikacji Java?
Najlepiej byłoby uzyskać te informacje bez korzystania z JNI.
Runtime.getRuntime().freeMemory()
zgodnie z sugestią w przyjętej odpowiedzi NIE daje ci ilości wolnej pamięci.Odpowiedzi:
Możesz uzyskać pewne ograniczone informacje o pamięci z klasy Runtime. To naprawdę nie jest dokładnie to, czego szukasz, ale pomyślałem, że zapewnię to dla kompletności. Oto mały przykład. Edycja: Możesz również uzyskać informacje o użyciu dysku z klasy java.io.File. Wykorzystanie miejsca na dysku wymaga Java 1.6 lub wyższej.
źródło
Java.lang.management pakiet nie daje o wiele więcej informacji niż Runtime - na przykład to daje pamięć sterty (
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
) oddzielić od pamięci spoza sterty (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
).Można również uzyskać użycie procesora proces (bez pisania własnego kodu JNI), ale trzeba rzucać
java.lang.management.OperatingSystemMXBean
Docom.sun.management.OperatingSystemMXBean
. Działa to w systemach Windows i Linux, nie testowałem go gdzie indziej.Na przykład ... częściej wywoływaj metodę getCpuUsage (), aby uzyskać dokładniejsze odczyty.
źródło
OperatingSystemMXBean
docom.sun.management.OperatingSystemMXBean
i poprzedzić wszystkie wystąpieniagetOperatingSystemMXBean()
zManagementFactory.
. Musisz odpowiednio zaimportować wszystkie klasy.getCpuUsage
oznacza, że system używa wszystkich dostępnych procesorów w 100%?((double)( processCpuTime - lastProcessCpuTime )) / ((double)( systemTime - lastSystemTime ))
Myślę, że najlepszą metodą jest implementacja interfejsu API SIGAR przez Hyperic . Działa z większością głównych systemów operacyjnych (prawie wszystko, co nowoczesne) i jest bardzo łatwy w obsłudze. Deweloperzy reagują bardzo szybko na swoich forach i listach dyskusyjnych. Podoba mi się również, że jest licencjonowany na
GPL2Apache . Podają też mnóstwo przykładów w Javie!SIGAR == Informacje o systemie, narzędzie do gromadzenia i raportowania.
źródło
Istnieje projekt Java, który korzysta z JNA (więc nie ma bibliotek rodzimych do zainstalowania) i jest w fazie rozwoju. Obecnie obsługuje Linux, OSX, Windows, Solaris i FreeBSD i zapewnia informacje o pamięci RAM, procesorze, baterii i systemie plików.
źródło
W przypadku systemu Windows poszedłem w ten sposób.
Oto link ze szczegółami.
źródło
Możesz uzyskać pewne informacje na poziomie systemu
System.getenv()
, używając , przekazując odpowiednią nazwę zmiennej środowiskowej jako parametr. Na przykład w systemie Windows:W przypadku innych systemów operacyjnych obecność / brak i nazwy odpowiednich zmiennych środowiskowych będą się różnić.
źródło
Dodaj zależność OSHI przez maven:
Uzyskaj pozostałą pojemność baterii w procentach:
źródło
Zobacz interfejsy API dostępne w pakiecie java.lang.management . Na przykład:
OperatingSystemMXBean.getSystemLoadAverage()
ThreadMXBean.getCurrentThreadCpuTime()
ThreadMXBean.getCurrentThreadUserTime()
Jest tam również wiele innych przydatnych rzeczy.
źródło
Zwykle w celu uzyskania informacji o niskim poziomie systemu operacyjnego można wywoływać specyficzne dla systemu operacyjnego polecenia, które dostarczają żądane informacje za pomocą Runtime.exec () lub odczytywać pliki takie jak / proc / * w systemie Linux.
źródło
Użycie procesora nie jest proste - java.lang.management poprzez com.sun.management.OperatingSystemMXBean.getProcessCpuTime jest blisko (patrz doskonały fragment kodu Patricka powyżej), ale pamiętaj, że daje on dostęp tylko do czasu, jaki procesor spędził w twoim procesie. nie powie ci o czasie procesora spędzonym na innych procesach, ani nawet czasie procesora poświęconym na działania systemowe związane z twoim procesem.
na przykład mam proces Java wymagający intensywnej pracy sieci - to jedyna działająca rzecz, a procesor ma 99%, ale tylko 55% z tego jest zgłaszane jako „procesor procesora”.
nawet nie zaczynaj od „przeciętnego obciążenia”, ponieważ jest to prawie bezużyteczne, mimo że jest to jedyny związany z procesorem element na fasoli MX. gdyby tylko słońce w swojej sporadycznej mądrości ujawniło coś takiego jak „getTotalCpuTime” ...
do poważnego monitorowania procesora SIGAR wspomniany przez Matta wydaje się najlepszym wyborem.
źródło
Włącz
Windows
, możesz uruchomićsysteminfo
polecenie i pobrać jego dane wyjściowe, na przykład za pomocą następującego kodu:źródło
Jeśli używasz Jrockit VM, oto inny sposób uzyskania wykorzystania procesora VM. Środowisko wykonawcze może również zapewnić obciążenie procesora na procesor. Użyłem tego tylko w Red Hat Linux do obserwowania wydajności Tomcat. Aby to zadziałało, musisz włączyć JMX remote w catalina.sh.
źródło
Jest wciąż w fazie rozwoju, ale możesz już używać jHardware
Jest to prosta biblioteka, która usuwa dane systemowe za pomocą Java. Działa zarówno w systemie Linux, jak i Windows.
źródło
Jeden prosty sposób, za pomocą którego można uzyskać informacje o poziomie systemu operacyjnego, i przetestowałem na moim Macu, który działa dobrze:
Można znaleźć wiele odpowiednich metryk systemu operacyjnego tutaj
źródło
Hej, możesz to zrobić dzięki integracji java / com. Uzyskując dostęp do funkcji WMI, możesz uzyskać wszystkie informacje.
źródło
Aby uzyskać obciążenie systemu średnio 1 minutę, 5 minut i 15 minut wewnątrz kodu Java, możesz to zrobić, wykonując polecenie,
cat /proc/loadavg
używając i interpretując go jak poniżej:Aby uzyskać fizyczną pamięć systemową , wykonując polecenie,
free -m
a następnie interpretując go jak poniżej:źródło