Episode ini membahas native image di Quarkus: kompilasi dengan GraalVM atau Mandrel, build time augmentation dan AOT compilation, optimasi startup time dan memory footprint, serta debugging native image dan tradeoff kompatibilitas.

Di episode 1 kalian mendengar janji Quarkus: startup puluhan milidetik dan memory footprint kecil. Janji itu diwujudkan lewat native image — kompilasi ahead-of-time yang mengubah aplikasi Java menjadi executable mandiri tanpa JVM.
Episode 16 membahas native image secara menyeluruh: kompilasi dengan GraalVM atau Mandrel, build time augmentation dan AOT compilation, optimasi startup dan memory, serta debugging native image dan tradeoff kompatibilitas yang harus kalian pahami.
GraalVM adalah JDK dengan kompiler ahead-of-time. Mandrel adalah distribusi GraalVM yang dioptimalkan untuk Quarkus oleh Red Hat. Keduanya mampu mengkompilasi aplikasi menjadi native executable.
Pastikan GraalVM terinstall, atau gunakan container build:
./mvnw package -Pnative
./mvnw package -Pnative -Dquarkus.native.container-build=trueFlag -Dquarkus.native.container-build=true menjalankan kompilasi di dalam container, sehingga tidak perlu menginstall GraalVM lokal — cukup Docker berjalan.
Setelah build, jalankan executable langsung:
./target/belajar-quarkus-1.0.0-SNAPSHOT-runnerTidak ada java -jar — file -runner adalah executable mandiri. Perintah curl http://localhost:8080/hello menunjukkan aplikasi merespons hampir seketika.
Kunci kombinasi build-time augmentation (episode 2) dan AOT compilation. Quarkus mengolah metadata di fase build, lalu GraalVM mengkompilasi aplikasi dengan konteks statis: semua class yang dipakai sudah diketahui, reflection diizinkan secara eksplisit, dan kode yang tidak terpakai dibuang.
Konfigurasi yang melibatkan nilai build-time (seperti quarkus.native.*) diproses saat kompilasi, bukan runtime. Ini sebabnya beberapa property tidak bisa diubah via environment variable — mereka sudah dibekukan di dalam executable.
Perbandingan tipikal:
JVM mode : 0.7-1.2 detik, memory 150-300MB
Native image : 0.02-0.08 detik, memory 50-80MBNative image sangat cocok untuk serverless dan autoscaling Kubernetes di mana pod sering dibuat dan dihancurkan.
Beberapa opsi konfigurasi:
quarkus.native.remove-unused-symbols=true
quarkus.native.enable-fallback-images=false
quarkus.native.strip-debug-symbols=true
quarkus.native.gc=epsilonremove-unused-symbols: membuang simbol yang tidak terpakai.gc=epsilon: garbage collector tanpa deallocation — cocok untuk workload pendek berlatensi minimal.Ukur dan verifikasi optimasi:
time ./target/belajar-quarkus-1.0.0-SNAPSHOT-runner &
curl -s http://localhost:8080/q/healthtime mengukur durasi eksekusi. Bandingkan JVM vs native untuk data konkret sebelum menurunkan target kinerja.
Native image bukan tanpa biaya:
@RegisterForReflection atau konfigurasi.import io.quarkus.runtime.annotations.RegisterForReflection;
@RegisterForReflection
public class DtoPesan {
public String isi;
public long timestamp;
}@RegisterForReflection memberitahu GraalVM agar mempertahankan metadata reflection untuk DtoPesan di native image. Selalu audit kode yang memakai reflection sebelum build native.
Mode JVM tetap tersedia untuk debugging; gunakan native di produksi. Untuk masalah khusus native, jalankan dengan laporan terperinci:
quarkus.native.enable-reports=truequarkus.native.enable-reports=true menghasilkan laporan terperinci tentang fitur yang digunakan GraalVM — berguna saat terjadi error yang hanya muncul di native.
Episode 16 memberi kalian senjata pamungkas Quarkus: memahami native image dengan GraalVM dan Mandrel, bagaimana build-time augmentation dan AOT bekerja sama, strategi optimasi startup, memory, dan ukuran, serta tradeoff dan cara debugging yang harus kalian ketahui sebelum deploy native di produksi.
Inti yang harus dibawa pulang:
-Dquarkus.native.container-build=true membangun native tanpa GraalVM lokal.@RegisterForReflection.quarkus.native.enable-reports=true membantu debugging khusus native.Di episode 17 selanjutnya kita akan membahas testing dan quality assurance — unit testing dengan JUnit 5 dan Quarkus Test Framework, integration test dengan @QuarkusTest, mocking dan REST client testing, serta Testcontainers dan end-to-end testing.