1. JMX (Java Management Extensions): JVM monitorinqinin ürəyi
Monitorinq — tətbiqiniz üçün müntəzəm tibbi müayinəyə bənzəyir. Əgər loqlama baş verənlərin yazıldığı gündəlik kimidirsə, monitorinq — bu anda sistemin vəziyyətini göstərən cihazlar dəstidir: temperatur, nəbz, təzyiq, şəkər səviyyəsi və JVM-in digər həyati vacib göstəriciləri.
O, yaddaşın həqiqətən nə qədər istifadə olunduğunu və onun sızıb-sızmadığını, neçə axının işlədiyini və onların hansı vəziyyətdə olduqlarını anlamağa kömək edir — gözləyir, icra olunur, yoxsa bloklanıb. Zibil toplayıcısının (GC) nə qədər tez-tez işə düşdüyünü, prosessorun nə dərəcədə yükləndiyini görə və yaddaşın və ya axınların sayının qəfil artması kimi həyəcanverici simptomları vaxtında aşkar edə bilərsiniz.
Qısaca desək, loqlama artıq nə baş verdiyini danışır, monitorinq isə indi nə baş verdiyini göstərir.
JMX-in əsasları: nədir və nə üçün
JMX — Java-da tətbiqinizin daxilində baş verənləri müşahidə etməyə və hətta onu bir qədər idarə etməyə imkan verən texnologiyadır. O, xüsusi obyektlər — MBean (Management Bean) vasitəsilə işləyir. Demək olar ki, bu, JVM-in daxilindəki «sensorlar» və «düymələr» kimidir: bəziləri sistemin vəziyyətini göstərir, digərləri isə nəyisə tənzimləməyə imkan verir.
JMX sayəsində JVM-ə hazırda nə qədər yaddaş ayrıldığını, neçə axının aktiv olduğunu, zibil toplanmasına nə qədər vaxt getdiyini və daha çoxunu bilə bilərsiniz — koda toxunmadan və tətbiqi yenidən başlatmadan.
Bu necə qurulub
JVM-də «qutudan çıxan kimi» artıq çoxlu MBean-lər var, onlar aşağıdakılar barədə məlumat verir:
- yaddaş (heap, non-heap);
- zibil toplayıcıları (GC);
- axınlar;
- siniflər (neçə dənə yüklənib, boşaldılıb);
- və hətta JVM-in özü (versiya, işə salma parametrləri).
JMX — avtomobildəki cihazlar paneli kimidir. Siz sürəti, dövrləri, mühərrikin temperaturunu görürsünüz — və bunların hamısı standart «sensorlar» (MBean-lər) vasitəsilə əlçatandır.
JMX-ə necə çıxış əldə etmək olar
Ən sadə yol — JDK-ya daxil olan standart JConsole utilitindən istifadə etməkdir.
JConsole-un işə salınması
- Terminalı/əmr sətrini açın.
- Aşağıdakı əmri icra edin:
jconsole - Monitorinq etmək istədiyiniz Java prosesini seçin (məsələn, tətbiqinizi).
JConsole JMX vasitəsilə JVM-ə qoşulacaq və yaddaş istifadəsi, axınların sayı, zibil toplayıcının aktivliyi və s. üzrə qrafiklər və cədvəllər göstərəcək.
Nümunə: yaddaş və axınlara baxış
JConsole-da "Memory" və "Threads" vərəqlərini açın. İstifadə olunan yaddaş həcminin necə dəyişdiyini, hazırda neçə axının yaşadığını, hansılarının aktiv, hansılarının gözləmədə olduğunu görəcəksiniz.
Fərdi MBean-lər
Öz metriklərinizin monitorinqi üçün fərdi MBean-lər yarada bilərsiniz (məsələn, işlənən sifarişlərin sayı). Amma bu artıq irəliləmiş mövzudur: standart MBean-lər çoxlu informasiya verir.
2. VisualVM — vizual monitorinq və profilləmə
Əgər JConsole — «cihazlar panelidirsə», VisualVM — rentgen, MRT və qan analizi olan tam diaqnostika mərkəzidir. O, təkcə monitorinq etməyə deyil, həm də tətbiqi profilləməyə, heap dump çıxarmağa, sızmaları təhlil etməyə və ən çox vaxtı hansı metodların sərf etdiyini görməyə imkan verir.
VisualVM-in quraşdırılması və işə salınması
- VisualVM JDK tərkibinə daxildir (adətən jvisualvm kimi), lakin ən son versiyanı visualvm.github.io saytından yükləyə bilərsiniz.
- Aşağıdakı əmr ilə başladılır:
jvisualvm - Başladıqdan sonra kompüterinizdə işləyən bütün Java proseslərinin siyahısını görəcəksiniz.
Prosesə qoşulma
- Siyahıda öz prosesinizi (məsələn, Main və ya MyApp) tapın.
- Üzərinə iki dəfə klikləyin — proses haqqında məlumat olan vərəq açılacaq.
- Hazırdır! İndi siz görəcəksiniz:
- Real vaxtda CPU və yaddaş istifadəsini.
- Axınların sayını və onların vəziyyətini.
- Yüklənmiş siniflərin siyahısını.
- heap dump və thread dump çıxarma imkanını.
VisualVM-in əsas imkanları
VisualVM ilə yaddaşın (həm heap, həm də non-heap) necə istifadə olunduğunu müşahidə edə bilərsiniz. Qrafikdə istehlakın artıb-artmadığı və ya sabitləşib-sabitləşmədiyi görünür. Zibil toplayıcısının işini yoxlamaq üçün "Perform GC" düyməsini basın — JVM dərhal yaddaşı təmizləməyə cəhd edəcək. heap dump (yaddaşın «sürəti») çıxarıb sızmaların axtarışı üçün onu araşdırmaq olar.
Alət həmçinin axınların vəziyyətini göstərəcək: neçə dənə işə salınıb, hansılar işləyir, gözləyir və ya bloklanıb. Əgər deadlock baş veribsə, VisualVM onu aşkar etməyə və qarşılıqlı bloklanmaları göstərməyə kömək edəcək.
Dərin təhlil üçün profilləmə mövcuddur: ən çox prosessor vaxtını və ya yaddaşı «yeyən» «isti» metodları görəcəksiniz. Bu, performansın gözlənilməz enişini diaqnostika edəndə faydalıdır.
Nümunə: mini-tətbiqi monitorinq edirik
public class MemoryLeakDemo {
public static void main(String[] args) throws InterruptedException {
List<byte[]> memoryConsumers = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
memoryConsumers.add(new byte[1024 * 1024]); // 1 MB
Thread.sleep(100); // Qrafik daha hamar olsun deyə bir az gözləyək
}
System.out.println("Hazırdır! VisualVM-də baxmağı unutmayın :)");
Thread.sleep(60000); // Təhlil üçün tətbiqi açıq saxlayırıq
}
}
İndi:
- Proqramı işə salın.
- VisualVM-i açın, prosesə qoşulun.
- Yaddaş istifadəsinin necə artdığını izləyin.
- heap dump çıxarın, yaddaşı tutan massivləri tapın.
3. Java Flight Recorder (JFR): JVM üçün «qara qutu»
JFR nədir
Java Flight Recorder — tətbiqin işinə dair ətraflı hadisələri toplamaq üçün JVM-ə quraşdırılmış alətdir. Bu «qara qutu»dur: JFR baş verənləri JVM-də yazır ki, sonradan dar boğazları və ya insidentin səbəblərini tapmaq mümkün olsun.
JFR nə toplayır:
- GC hadisələri;
- axınlar barədə məlumat;
- metod çağırma tezliyi və vaxt profilləri;
- pauzalar və gecikmələr;
- istisnalar və xətalar.
JFR-i necə aktiv etmək olar
Java 11+ ilə JFR birbaşa OpenJDK-nın tərkibindədir.
JFR ilə işə salma
java -XX:StartFlightRecording=filename=recording.jfr,duration=60s,settings=profile -jar MyApp.jar
- filename=recording.jfr — yazının hara saxlanılacağı.
- duration=60s — nə qədər müddət yazılacağı.
- settings=profile — detallılıq səviyyəsi (default, profile, continuous).
Nəticələrin görüntülənməsi
.jfr faylını təhlil etmək üçün JDK Mission Control (JMC) istifadə olunur:
- JMC-ni yükləyin: jdk.java.net/jmc
- recording.jfr faylını açın.
- Qrafikləri, «isti» metodları, GC pauzalarını və axın aktivliyini öyrənin.
Nümunə: «qara qutu»nu yazırıq
- Tətbiqi JFR ilə işə salın (yuxarıdakı əmri baxın).
- JDK Mission Control-u açın, yazı faylını yükləyin.
- CPU/yaddaş üzrə «isti» yerləri, zibil toplanmasının tezliyini və aktiv axınların sayını qiymətləndirin.
4. Təcrübə: tətbiqi monitorinq edirik
import java.util.ArrayList;
import java.util.List;
public class MonitoringExample {
public static void main(String[] args) throws InterruptedException {
List<byte[]> memory = new ArrayList<>();
for (int i = 0; i < 50; i++) {
memory.add(new byte[2 * 1024 * 1024]); // 2 MB
Thread.sleep(500);
}
// Axını işə salırıq
new Thread(() -> {
while (true) {
try {
Thread.sleep(1000);
System.out.println("Fon axını işləyir...");
} catch (InterruptedException e) {
break;
}
}
}).start();
Thread.sleep(20000); // Monitorinq üçün tətbiqi açıq saxlayırıq
}
}
Addımlar:
- Proqramı işə salın.
- VisualVM-i açın, prosesi tapın, yaddaş qrafikinə və axınlara baxın.
- heap dump və thread dump çıxarmağa cəhd edin.
- İrəliləmişlər üçün: JFR ilə işə salın və nəticələrə JMC-də baxın.
5. Faydalı nüanslar
Monitorinq alətlərinin müqayisəli cədvəli
| Alət | Nəyə uyğundur | Necə işə salınır | Xüsusiyyətlər |
|---|---|---|---|
| JConsole (JMX) | JVM-in əsas metrikləri, axınlar, GC | |
Sadədir, JDK-ya daxildir |
| VisualVM | Monitorinq, profilləmə, heap dump | |
Qrafiklər, yaddaş və CPU təhlili |
| Java Flight Recorder | JVM hadisələrinin dərin təhlili | |
JMC-də təhlil, «qara qutu» |
| JDK Mission Control | JFR fayllarına baxış | ayrı proqram | Ətraflı analitika, hesabatlar |
Tövsiyələr
- Təkcə istehsal mühitində deyil, test mərhələsində də monitorinq edin. Beləcə yaddaş sızmalarını və «asılı qalan» axınları daha tez tutacaqsınız.
- Heap dump — qorxulu deyil! Sızma şübhəsi olduqda yaddaş dump-ını çıxarın və onu VisualVM-də öyrənin.
- JFR ilə eksperiment etməkdən çəkinməyin. Hər şey dərhal aydın olmasa belə, hadisələr və qrafiklər dar boğazları tapmağa kömək edəcək.
- JMX-dən proqram vasitəsilə istifadə etmək olar. Məsələn, metrikləri Prometheus/Grafana-ya göndərmək üçün.
- Profilləmə — daimi iş rejimi üçün deyil. Profilatorları yalnız punktual olaraq aktivləşdirin, əks halda tətbiq yavaşıya bilər.
6. JVM monitorinqində tipik səhvlər
Səhv №1: Ümumiyyətlə monitorinq etməmək. Bir çox yeni başlayanlar düşünür ki, əgər tətbiq «işləyirsə», deməli hər şey qaydasındadır. Əslində yaddaş və axınlarla bağlı problemlər tez-tez yüklənmə altında və ya zaman keçdikcə üzə çıxır. Heç olmasa vaxtaşırı VisualVM/JConsole açmağa tənbəllik etməyin.
Səhv №2: Hazırlıq olmadan nəhəng tətbiqlərdə heap dump çıxarmaq. Böyük bir tətbiqin heap dump-ı giqabaytlarla ölçülə bilər və prosesi bir neçə saniyəlik «dondura» bilər. Bunu test mühitində və ya söhbət istehsal mühitindən gedirsə, «sakit» saatlarda edin.
Səhv №3: GC və axın göstəricilərini görməməzlikdən gəlmək. GC-yə sərf olunan vaxtın daima yüksək payı — narahatedici siqnaldır! Axınların sayı stabil şəkildə artırsa — axın sızmasını axtarın.
Səhv №4: Monitorinq nəticələrini təhlil etməmək. Təkcə VisualVM-i açmaq kifayət deyil. Yaddaşı hansı obyektlərin tutduğuna, hansı metodların CPU-nu «yeməsinə», nə üçün deadlock-lar yarandığına baxın. Stack trace-ləri və səbəbləri araşdırın.
Səhv №5: Anlaşılmadan profilləşdiriciləri istehsal mühitində istifadə etmək. Profilləmə tətbiqi əhəmiyyətli dərəcədə ləngidə bilər. Onu yalnız diaqnostika üçün aktivləşdirin, «daimi» rejimdə yox.
GO TO FULL VERSION