JavaRush /Java Blog /Random-ID /Bagaimana hubungan container dan Java?
Павел
Level 11

Bagaimana hubungan container dan Java?

Dipublikasikan di grup Random-ID
Bagi mereka yang telah membaca tentang container dan Docker , tetapi tidak memahami bagaimana Java melekat pada container. Pertama, mari kita segarkan kembali ingatan kita tentang memori Java . Izinkan saya mengingatkan Anda bahwa memori terdiri dari Stack dan Heap, yang menggunakan RAM (random access memory) server; jika berbicara lebih jauh tentang memori, yang kami maksud adalah RAM. Sekarang mari kita lihat wadahnya secara melintang. Bagaimana hubungan container dan Java?  - 1 Tidak, tentu saja tidak, kami tidak tertarik dengan pantat dan paha, kami akan melihat struktur memori di wadahnya. Hal ini dapat dibagi menjadi tiga bagian: • Memori Heap – heap itu sendiri; • Off Heap adalah segala sesuatu yang tidak ada dalam heap; • OS Overhead adalah overhead memori untuk mengimplementasikan proses di dalam container. Bagaimana hubungan container dan Java?  - 2 Katakanlah: Kita telah mengalokasikan 1 Gb ke wadah, pada gambar itu adalah Batas Kontainer - batasnya ditandai dengan persegi panjang biru. Kami mengalokasikan 80%, yaitu 0,8 Gb, untuk memori Java dalam wadah, dan Heap memberi kami sekitar 80% dari wadah, yaitu tidak kurang dari 0,8 Gb, karena OS Overhead mengambil bagian dari sumber daya (overhead) untuk memelihara proses. Sekitar 20% kontainer tersisa untuk segala sesuatu yang tidak terhubung ke heap ( Off Heap ). Area yang Digunakan pada gambar menunjukkan area memori yang digunakan untuk menjalankan aplikasi. Sekarang kita perlu membicarakan situasi ketika memori dalam container mungkin habis. OutOfMemoryError Jika konsumsi memori aplikasi ( Used area ) mencapai batas heap ( Heap ), kita akan menangkap OutOfMemoryError (OOM Error) . Artinya tidak ada cukup ruang di heap, yaitu di area memori tempat objek yang dibuat secara terprogram dalam aplikasi ditempatkan. Bagaimana hubungan container dan Java?  - 3 Jika belum sepenuhnya jelas, saya akan menjelaskannya pada kucing. OOM Error adalah ketika seekor kucing berteriak sangat lama di depan pintu balkon, dan ketika pintu ini dibuka, dia berdiri di ambang pintu dan tidak pergi ke mana pun, sering dikatakan bahwa kucing itu membeku. Jika Anda mendorongnya tepat waktu, dia akan menganga dan pergi ke balkon untuk melakukan urusan kucingnya. Bagaimana hubungan container dan Java?  - 4 OOM Killer Ini adalah situasi lain yang dapat terjadi dalam sebuah container ketika memori habis. Bagaimana hubungan container dan Java?  - 5 Jika sebuah program berada di luar container, kita mendapatkan OutOfMemory Killer (OOM Killer) - ini adalah proses yang menghentikan aplikasi untuk menyelamatkan kernel dari kerusakan. Ini mengorbankan aplikasi agar container tetap berjalan. Bukan fakta containernya akan terjatuh, namun aplikasi yang berjalan di dalamnya pasti terjatuh. Hal ini terjadi jika Anda membiarkan konsumsi memori aplikasi Java tidak terkontrol. Sekali lagi pada kucing. Jika Anda memutuskan untuk tidur lebih lama di hari Sabtu dan lupa memberi makanan pada kucing, maka OOM Killerbunganya terjamin, potnya tidak boleh rusak, tapi bunganya harus ditanam kembali. Bagaimana hubungan container dan Java?  - 6 Apa perbedaan antara OOM Error dan OOM Killer? Anda dapat memproses Kesalahan OOM dan melakukan beberapa tindakan (misalnya: menskalakan aplikasi), dan OOM Killer hanya akan menghentikan seluruh proses. OOM Killer mirip dengan kill-9 (kill minus sembilan) - perintah yang mematikan proses di Linux . Bagaimana hubungan container dan Java?  - 7 Soalnya implementasi container yang paling populer adalah container Docker yang berbasis Linux , meskipun dijalankan di Windows , kernelnya tetap dari Linux . Di Linux, kami tertarik pada satu konsep: CGroups (grup kontrol bahasa Inggris) - mekanisme kernel Linux yang membatasi dan mengisolasi sumber daya komputasi (prosesor, jaringan, sumber daya memori, sumber daya I/O) untuk grup proses. Sederhananya, mekanisme ini memungkinkan Anda mengelola sumber daya dalam sebuah wadah, dalam memori kasus kami. Bagaimana Java berhubungan dengan hal ini? Melalui mekanisme CGroups Java dapat melekat pada memori container. Tapi ini semua tergantung versi Java. Misalnya, Java 7 tidak mengetahui cara menggunakan CGroups , dan batasan container tidak diketahui. Secara default, ukuran heap maksimal = ¼ memori fisik. Jika aplikasi melebihi batas container, maka akan terjadi OOM Killer , dan jika batas container tidak disetel, maka aplikasi akan mengambil memori dari aplikasi lain di server (lebih baik tetapkan batasan, jika tidak semua orang akan kehilangan) . Anda tentu saja dapat menggunakan pengaturan heap atau menggunakan "gambar" khusus untuk mengatasi masalah ini, tetapi cara termudah adalah dengan menggunakan versi Java yang benar. Versi yang benar dimulai dengan Java 8 x131 (porting dari Java 9), ia mulai memahami CGroups . Dan di Java 10, dukungan untuk container muncul: UseContainerSupport , kemudian fungsi ini di-porting ke Java 8 x 191 . Atau Anda bisa menggunakan Java: 11+ . Yang dapat disimpulkan: Saat menggunakan memori kontainer, Anda mungkin menerima OutOfMemoryError (OOM Error) atau OutOfMemoryKiller (OOM Killer). Dalam kasus pertama, aplikasi tidak akan langsung crash, Kesalahan OOM dapat ditangkap, tindakan dapat diproses dan dikendalikan. Misalnya, skalakan aplikasi. Jika terjadi OOM Killer, aplikasi akan langsung crash, dan tidak ada pilihan lagi untuk menyimpannya. Dan yang terburuk adalah secara lahiriah wadah itu sendiri akan baik-baik saja, yaitu Anda mungkin tidak curiga ada sesuatu yang jatuh di sana. Mekanisme Linux digunakan untuk berinteraksi dengan container dan memori Java. Namun tidak semua Java mengimplementasikannya. Untuk menghindari masalah pada Java 8, Anda perlu menggunakan versi mulai dari 131, atau lebih baik lagi, dari 191. Atau gunakan Java: 11+. Untuk latihan: OutOfMemoryError: tangkap jika Anda bisa
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION