Menggunakan memori secara efisien untuk aplikasi Java di Azure Container Apps (pratinjau)

Java Virtual Machine (JVM) menggunakan memori secara konservatif karena mengasumsikan memori OS harus dibagikan di antara beberapa aplikasi. Namun, aplikasi kontainer Anda dapat mengoptimalkan penggunaan memori dan membuat jumlah memori maksimum yang mungkin tersedia untuk aplikasi Anda. Pengoptimalan memori ini dikenal sebagai penyesuaian memori otomatis Java. Ketika pengepasan memori diaktifkan, performa aplikasi Java biasanya ditingkatkan antara 10% dan 20% tanpa perubahan kode apa pun.

Azure Container Apps menyediakan kecocokan memori otomatis dalam keadaan berikut:

  • Satu aplikasi Java berjalan dalam kontainer.
  • Aplikasi Anda disebarkan dari kode sumber atau file JAR.

Penyesuaian memori otomatis diaktifkan secara default, tetapi Anda dapat menonaktifkan secara manual.

Menonaktifkan penyesuaian memori

Penyesuaian memori otomatis sangat membantu dalam sebagian besar skenario, tetapi mungkin tidak ideal untuk semua situasi. Anda dapat menonaktifkan penyesuaian memori baik secara manual maupun otomatis.

Menonaktifkan Secara Manual

Untuk menonaktifkan penyesuaian memori saat Anda membuat aplikasi kontainer, atur variabel BP_JVM_FIT lingkungan ke false.

Contoh berikut menunjukkan kepada Anda cara menggunakan perintah create, up, dan update untuk menonaktifkan kecocokan memori.

az containerapp create \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --image <CONTAINER_IMAGE_LOCATION> \
  --environment <ENVIRONMENT_NAME> \
  --env-vars BP_JVM_FIT="false" 

Untuk memverifikasi bahwa pengepasan memori dinonaktifkan, periksa log Anda untuk pesan berikut:

Menonaktifkan penyesuaian memori jvm, alasannya: dinonaktifkan secara manual

Nonaktifkan otomatis

Pengikatan memori secara otomatis dinonaktifkan ketika salah satu kondisi berikut terpenuhi:

  • Memori kontainer terbatas: Memori kontainer kurang dari 1 GB.

  • Mengatur opsi memori secara eksplisit: Ketika satu atau beberapa pengaturan memori ditentukan dalam variabel lingkungan melalui JAVA_TOOL_OPTIONS. Opsi pengaturan memori mencakup nilai berikut:

    • -XX:MaxRAMPercentage
    • -XX:MinRAMPercentage
    • -XX:InitialRAMPercentage
    • -XX:MaxMetaspaceSize
    • -XX:MetaspaceSize
    • -XX:ReservedCodeCacheSize
    • -XX:MaxDirectMemorySize
    • -Xmx
    • -Xms
    • -Xss

    Misalnya, pemasangan memori secara otomatis dinonaktifkan jika Anda menentukan ukuran heap maksimum dalam variabel lingkungan seperti yang ditunjukkan dalam contoh berikut:

    az containerapp update \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --image <CONTAINER_IMAGE_LOCATION>  \
      --set-env-vars JAVA_TOOL_OPTIONS="-Xmx512m" 
    

    Dengan penyesuaian memori dinonaktifkan, Anda akan melihat pesan berikut dicatatkan ke dalam log.

    Menonaktifkan penyesuaian memori JVM, alasan: gunakan pengaturan yang ditentukan dalam JAVA_TOOL_OPTIONS=-Xmx512m sebagai alternatif Menggunakan JAVA_TOOL_OPTIONS: -Xmx512m

  • Ukuran memori non-heap kecil: Kasus langka ketika ukuran heap atau non-heap yang dihitung terlalu kecil (kurang dari 200 MB).

Verifikasi bahwa kecocokan memori diaktifkan

Periksa aliran log Anda selama proses startup untuk pesan yang mengacu pada Konfigurasi Memori JVM Terhitung.

Berikut adalah contoh output pesan selama start-up.

Konfigurasi Memori JVM Terhitung: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memori: 2G, Jumlah Utas: 250, Jumlah Kelas yang Dimuat: 12924, Headroom: 0%)

Dibaca JAVA_TOOL_OPTIONS: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M

Konfigurasi runtime

Anda dapat mengatur variabel lingkungan untuk memengaruhi perilaku penyesuaian memori.

Variabel Satuan Contoh Deskripsi
BPL_JVM_HEAD_ROOM Persentase BPL_JVM_HEAD_ROOM=5 Sisakan ruang memori untuk sistem sesuai dengan persentase yang diberikan.
BPL_JVM_THREAD_COUNT Nomor BPL_JVM_THREAD_COUNT=200 Perkiraan jumlah maksimum utas.
BPL_JVM_CLASS_ADJUSTMENT Nomor
Persentase
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
Sesuaikan jumlah kelas JVM berdasarkan nilai atau persentase eksplisit.

Catatan

Mengubah variabel ini tidak menonaktifkan penyesuaian memori otomatis.

Peringatan kehabisan memori

Jika Anda memutuskan untuk mengonfigurasi pengaturan memori sendiri, Anda berisiko mengalami peringatan kekurangan memori.

Berikut adalah beberapa kemungkinan alasan mengapa kontainer Anda dapat kehabisan memori:

  • Memori timbunan lebih besar dari total memori yang tersedia.

  • Memori nonheap lebih besar dari total memori yang tersedia.

  • Memori heap + nonheap lebih besar dari total memori yang tersedia.

Jika kontainer Anda kehabisan memori, maka Anda mengalami peringatan berikut:

Peringatan OOM: memori tumpukan 1200M lebih besar dari 1G yang tersedia untuk alokasi (-Xmx1200M)

Langkah berikutnya