Kontainerisasi aplikasi Java Anda

Artikel ini memberikan gambaran umum tentang strategi dan pengaturan yang direkomendasikan untuk kontainerisasi aplikasi Java.

Saat Anda membuat kontainer aplikasi Java, pertimbangkan dengan cermat berapa banyak waktu CPU yang akan tersedia kontainer. Kemudian pertimbangkan berapa banyak memori yang akan tersedia baik dalam hal jumlah total memori, dan ukuran timbunan Java Virtual Machine (JVM). Di lingkungan kontainer, aplikasi mungkin memiliki akses ke semua prosesor dan oleh karena itu dapat menjalankan beberapa utas secara paralel. Namun, umum bahwa kontainer memiliki kuota CPU yang diterapkan yang dapat membatasi akses ke CPU.

JVM memiliki heuristik untuk menentukan jumlah "prosesor yang tersedia" berdasarkan kuota CPU, yang dapat secara dramatis memengaruhi performa aplikasi Java. Memori yang dialokasikan untuk kontainer itu sendiri dan ukuran area timbunan untuk JVM sama pentingnya dengan prosesor. Faktor-faktor ini akan menentukan perilaku pengumpul sampah (GC) dan performa keseluruhan sistem.

Membuat kontainer aplikasi baru

Saat Anda membuat kontainer beban kerja Java untuk aplikasi baru, Anda harus mempertimbangkan dua hal saat memikirkan memori:

  • Memori yang dialokasikan untuk kontainer itu sendiri.
  • Jumlah memori yang tersedia untuk proses Java.

Memahami ergonomi default JVM

Aplikasi memerlukan titik awal dan pengaturan. JVM memiliki ergonomi default dengan nilai yang telah ditentukan sebelumnya yang didasarkan pada jumlah prosesor dan jumlah memori yang tersedia dalam sistem. Nilai default yang diperlihatkan dalam tabel berikut digunakan saat JVM dimulai tanpa bendera atau parameter startup tertentu.

Tabel berikut ini memperlihatkan GC default yang digunakan untuk sumber daya yang tersedia:

Sumber daya tersedia Default GC
Sejumlah prosesor
Memori hingga 1791 MB
SerialGC
2+ prosesor
Memori 1792 MB atau lebih
G1GC

Tabel berikut menunjukkan ukuran timbunan maksimum default tergantung pada berapa banyak memori yang tersedia di lingkungan tempat JVM berjalan:

Memori tersedia Ukuran timbunan maksimum default
Hingga 256 MB 50% memori yang tersedia
256 MB hingga 512 MB ~127MB
Lebih dari 512 MB 25% memori yang tersedia

Ukuran timbunan awal default adalah 1/64 memori yang tersedia.

Nilai-nilai ini berlaku untuk OpenJDK 11 dan yang lebih baru, dan untuk sebagian besar distribusi, termasuk Microsoft Build of OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK, dan lainnya.

Menentukan memori kontainer

Pilih jumlah memori kontainer yang akan melayani beban kerja Anda dengan terbaik, tergantung pada kebutuhan aplikasi Anda dan pola penggunaannya yang khas. Misalnya, jika aplikasi Anda membuat grafik objek besar, maka Anda mungkin akan membutuhkan lebih banyak memori daripada yang Anda butuhkan untuk aplikasi dengan banyak grafik objek kecil.

Tip

Jika Anda tidak tahu berapa banyak memori yang akan dialokasikan, titik awal yang baik adalah 4 GB.

Menentukan memori tumpukan JVM

Ketika Anda mengalokasikan memori timbunan JVM, ketahuilah bahwa JVM membutuhkan lebih banyak memori daripada hanya apa yang digunakan untuk timbunan JVM. Ketika Anda mengatur memori timbunan JVM maksimum, memori tersebut tidak boleh sama dengan jumlah memori kontainer karena itu akan menyebabkan kesalahan Kontainer Kehabisan Memori (OOM) dan crash kontainer.

Tip

Alokasikan 75% memori kontainer untuk timbunan JVM.

Pada OpenJDK 11 dan yang lebih baru, Anda dapat mengatur ukuran tumpukan JVM dengan cara berikut:

Deskripsi Bendera Contoh
Nilai tetap -Xmx -Xmx4g
Nilai dinamis -XX:MaxRAMPercentage -XX:MaxRAMPercentage=75

Ukuran timbunan minimum/awal

Di mana lingkungan dijamin memiliki sejumlah memori yang dicadangkan ke instans JVM, seperti dalam kontainer, Anda harus mengatur ukuran tumpukan minimum - atau ukuran tumpukan awal - ke ukuran yang sama dengan ukuran tumpukan maksimum. Pengaturan ini menunjukkan kepada JVM bahwa ia tidak boleh melakukan tugas membebaskan memori ke OS.

Untuk mengatur ukuran tumpukan minimum, gunakan -Xms untuk jumlah absolut atau -XX:InitialRAMPercentage untuk jumlah persentase.

Penting

Bendera -XX:MinRAMPercentage, terlepas dari apa namanya, digunakan untuk mengatur persentase RAM maksimum default untuk sistem dengan HINGGA 256 MB RAM yang tersedia dalam sistem.

Chart showing the default heap size on OpenJDK 17.

Tentukan GC mana yang akan digunakan

Sebelumnya, Anda menentukan jumlah memori tumpukan JVM untuk memulai. Langkah selanjutnya adalah memilih GC Anda. Jumlah memori tumpukan JVM maksimum yang Anda miliki sering kali menjadi faktor dalam memilih GC Anda. Tabel berikut menjelaskan karakteristik setiap GC.

Faktor SerialGC ParalelGC G1GC ZGC ShenandoahGC
Jumlah core 1 2 2 2 2
Multi-utas Tidak Ya Ya Ya Ya
Ukuran timbunan Java <4 GByte <4 GByte >4 GByte >4 GByte >4 GByte
Pause Ya Ya Ya Ya (<1 ms) Ya (<10 mdtk)
Overhead Minimal Minimal Sedang Sedang Sedang
Efek latensi ekor Sangat Penting Sangat Penting Sangat Penting Kurang Penting Sedang
Versi JDK Semua Semua JDK 8+ JDK 17+ JDK 11+
Paling cocok untuk Timbunan kecil inti tunggal Timbunan kecil multi-inti atau beban kerja batch dengan ukuran timbunan apa pun Responsif dalam tumpukan sedang hingga besar (interaksi request-response/DB) Responsif dalam tumpukan sedang hingga besar (interaksi request-response/DB) Responsif dalam tumpukan sedang hingga besar (interaksi request-response/DB)

Tip

Untuk sebagian besar aplikasi layanan mikro tujuan umum, mulailah dengan GC Paralel.

Menentukan berapa banyak inti CPU yang diperlukan

Untuk GC apa pun selain SerialGC, kami merekomendasikan dua atau lebih inti vCPU - atau setidaknya 2000mcpu_limit di Kubernetes. Kami tidak menyarankan untuk memilih apa pun yang kurang dari 1 inti vCPU pada lingkungan kontainer.

Tip

Jika Anda tidak tahu berapa banyak inti yang akan dimulai, pilihan yang baik adalah 2 inti vCPU.

Pilih titik awal

Sebaiknya mulai dengan dua replika atau instans di lingkungan orkestrasi kontainer seperti Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps, dan Azure App Service. Tabel berikut ini meringkas titik awal yang direkomendasikan untuk kontainerisasi aplikasi Java baru Anda.

Core vCPU Memori kontainer Ukuran timbunan JVM GC Replika
2 4 GB 75% ParalelGC 2

Parameter JVM yang akan digunakan adalah: -XX:+UseParallelGC -XX:MaxRAMPercentage=75

Membuat kontainer aplikasi (lokal) yang sudah ada

Jika aplikasi Anda sudah berjalan di tempat atau di VM di cloud, kami sarankan Anda mulai dengan:

  • Jumlah memori yang sama dengan yang saat ini dapat diakses aplikasi.
  • Jumlah CPU (inti vCPU) yang sama dengan aplikasi yang saat ini telah tersedia.
  • Parameter JVM yang sama dengan yang saat ini Anda gunakan.

Jika kombinasi inti vCPU dan/atau memori kontainer tidak tersedia, pilih yang terdekat, bulatkan core vCPU dan memori kontainer.

Langkah berikutnya

Sekarang setelah Anda memahami rekomendasi umum untuk kontainerisasi aplikasi Java, lanjutkan ke artikel berikut untuk membuat garis besar kontainerisasi: