Episode ini membahas tuning performa JVM: profiling dengan JVisualVM, JFR, dan Flight Recorder, memahami garbage collector G1, ZGC, dan Shenandoah, heap tuning dan JVM flags, pengukuran latency versus throughput, serta teknik optimalisasi kode.

Setelah aplikasi berjalan, pertanyaan berikutnya adalah: seberapa cepat dan efisien? Episode 16 membahas performance tuning dan garbage collection — cara memprofil JVM, memahami garbage collector modern, mengatur heap dan JVM flags, serta menulis kode yang optimal.
Performa JVM sangat dipengaruhi konfigurasi dan pemahaman tentang garbage collection. Episode ini memberi kalian alat untuk menemukan bottleneck dan teknik untuk mengoptimalkannya, dari pengukuran hingga penerapan.
JVisualVM adalah tool grafis untuk memprofil aplikasi Java. Untuk aplikasi lokal, cukup jalankan:
jvisualvmJVisualVM menampilkan CPU, memory, thread, dan metode yang lambat.
Java Flight Recorder (JFR) adalah profiler overhead rendah yang menjadi bagian JDK. Rekam saat aplikasi berjalan:
java -XX:StartFlightRecording=filename=aplikasi.jfr,duration=60s -jar aplikasi.jar-XX:StartFlightRecording merekam profil selama 60 detik ke file .jfr, yang bisa dianalisis dengan JMC (JDK Mission Control).
Garbage collector membebaskan memori objek yang tidak lagi direferensikan. GC yang baik menjaga pause singkat dan throughput tinggi. Memilih GC yang tepat adalah keputusan penting.
G1 (Garbage First) adalah default sejak Java 9. G1 membagi heap menjadi region dan menargetkan pause time yang bisa dikonfigurasi:
java -XX:MaxGCPauseMillis=200 -jar aplikasi.jar-XX:MaxGCPauseMillis=200 memberi target pause maksimum 200 milidetik per GC cycle.
ZGC dan Shenandoah dirancang untuk pause yang sangat singkat, bahkan untuk heap terabyte. Aktifkan dengan flag:
java -XX:+UseZGC -jar aplikasi.jarZGC cocok untuk aplikasi yang sensitif terhadap latency, sementara G1 menjadi pilihan seimbang untuk kebanyakan kasus.
Ukuran heap dikontrol dengan -Xms (awal) dan -Xmx (maksimum). Seragamkan keduanya untuk menghindari resize:
java -Xms512m -Xmx512m -jar aplikasi.jar-Xms512m -Xmx512m menetapkan heap tetap 512 MB, menghindari overhead penyesuaian ukuran.
Beberapa flags yang sering dipakai: -XX:+PrintGCDetails untuk log GC, -XX:MetaspaceSize untuk metadata class, dan -XX:+HeapDumpOnOutOfMemoryError untuk membuat heap dump saat OOM:
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/aplikasi.hprof -jar aplikasi.jarLatency adalah waktu satu operasi; throughput adalah jumlah operasi per satuan waktu. Keduanya sering bertolak belakang. Tuning yang baik menyeimbangkan keduanya sesuai kebutuhan aplikasi.
Optimasi dimulai dari kode, bukan hanya flags. Prinsip penting: hindari alokasi objek berlebihan, gunakan struktur data yang tepat, dan hindari kerja sia-sia dalam loop:
public class Optimasi {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append("angka=").append(i).append(", ");
}
System.out.println(sb.length());
}
}StringBuilder.append jauh lebih efisien daripada penggabungan string dengan operator + di dalam loop, karena menghindari pembuatan objek String berulang.
Episode 16 membahas performance tuning: profiling dengan JVisualVM, JFR, dan Flight Recorder, memahami GC G1, ZGC, dan Shenandoah, mengatur heap dan JVM flags, mengukur latency versus throughput, serta teknik optimalisasi kode.
Inti yang harus dibawa pulang:
-Xms dan -Xmx mengatur ukuran heap.-XX:MaxGCPauseMillis menargetkan pause GC.Di episode 17 selanjutnya kita akan membahas testing dan quality assurance — unit testing dengan JUnit 5, mocking dengan Mockito dan pendekatan TDD, integration testing, contract testing, dan test containers, serta static analysis dengan SpotBugs, Checkstyle, dan PMD. Saatnya membangun jaring pengaman kualitas!