JavaRush /Blog Java /Random-MS /Bagaimanakah kontena dan Java berkaitan?

Bagaimanakah kontena dan Java berkaitan?

Diterbitkan dalam kumpulan
Bagi mereka yang telah membaca tentang bekas dan Docker , tetapi tidak faham bagaimana Java telah melekat pada bekas. Mula-mula, mari kita segarkan semula ingatan kita tentang memori Java . Biar saya ingatkan anda bahawa memori terdiri daripada Stack dan Heap, yang menggunakan RAM (memori akses rawak) pelayan; apabila bercakap lebih lanjut tentang memori, kami akan maksudkan RAM. Sekarang mari kita lihat bekas dalam keratan rentas. Bagaimanakah kontena dan Java berkaitan?  - 1 Tidak, sudah tentu tidak, kita tidak berminat dengan pantat dan peha, kita akan melihat struktur memori dalam bekas. Ia boleh dibahagikan kepada tiga bahagian: • Heap Memory – timbunan itu sendiri; • Off Heap ialah semua yang tiada dalam timbunan; • OS Overhed ialah overhed memori untuk melaksanakan proses di dalam bekas. Bagaimanakah kontena dan Java berkaitan?  - 2 Katakan: Kami telah memperuntukkan 1 Gb kepada bekas, dalam rajah ia akan menjadi Had Kontena - sempadannya ditunjukkan oleh segi empat tepat biru. Kami memperuntukkan 80%, iaitu, 0.8 Gb, untuk memori Java dalam bekas, dan Heap membawa kami kira-kira 80% daripada bekas, iaitu, tidak kurang daripada 0.8 Gb, kerana OS Overhed mengambil sebahagian daripada sumber (overhed) untuk mengekalkan proses. Kira-kira 20% bekas ditinggalkan untuk semua yang tidak disambungkan ke timbunan ( Off Heap ). Kawasan Digunakan dalam rajah menunjukkan kawasan memori yang digunakan untuk menjalankan aplikasi. Sekarang kita perlu bercakap tentang situasi apabila memori dalam bekas mungkin kehabisan. OutOfMemoryError Jika penggunaan memori aplikasi ( Kawasan terpakai ) mencapai had timbunan ( Heap ), kami akan menangkap OutOfMemoryError (OOM Error) . Yang mengatakan bahawa tidak ada ruang yang mencukupi dalam timbunan, iaitu, dalam kawasan memori di mana objek yang dicipta secara pemrograman dalam aplikasi diletakkan. Bagaimanakah kontena dan Java berkaitan?  - 3 Jika ia masih belum jelas sepenuhnya, saya akan menerangkannya dalam kucing. Ralat OOM ialah apabila kucing menjerit lama dan lama di hadapan pintu ke balkoni, dan apabila pintu ini dibuka, dia berdiri di ambang pintu dan tidak pergi ke mana-mana, mereka sering mengatakan bahawa kucing itu beku. Jika anda menolaknya tepat pada masanya, dia akan menjatuhkan rahangnya dan pergi ke balkoni untuk melakukan perniagaan kucingnya. Bagaimanakah kontena dan Java berkaitan?  - 4 OOM Killer Ini adalah satu lagi situasi yang boleh berlaku dalam bekas apabila memori kehabisan. Bagaimanakah kontena dan Java berkaitan?  - 5 Jika program berada di luar bekas, kita mendapat OutOfMemory Killer (OOM Killer) - ini ialah proses yang menamatkan aplikasi untuk menyelamatkan kernel daripada ranap. Ia mengorbankan aplikasi untuk memastikan bekas berjalan. Bukan fakta bahawa bekas itu akan jatuh, tetapi aplikasi yang berjalan di dalamnya pasti akan jatuh. Ini berlaku jika anda membiarkan penggunaan memori aplikasi Java tidak terkawal. Sekali lagi pada kucing. Jika anda memutuskan untuk tidur lebih lama pada hari Sabtu dan terlupa memberi makanan kepada kucing, maka OOM Killerbunga dijamin, pasu mungkin tidak rosak, tetapi bunga itu perlu ditanam semula. Bagaimanakah kontena dan Java berkaitan?  - 6 Apakah perbezaan antara Ralat OOM dan Pembunuh OOM? Anda boleh memproses Ralat OOM dan melakukan beberapa tindakan (contohnya: skala aplikasi), dan OOM Killer hanya akan mematikan keseluruhan proses. OOM Killer adalah serupa dengan kill-9 (kill minus nine) - arahan yang membunuh proses dalam Linux . Bagaimanakah kontena dan Java berkaitan?  - 7 Masalahnya ialah pelaksanaan kontena yang paling popular ialah bekas Docker , yang berasaskan Linux , walaupun anda menjalankannya di bawah Windows , kernel masih daripada Linux . Di Linux, kami berminat dengan satu konsep: CGroups (kumpulan kawalan bahasa Inggeris) - mekanisme kernel Linux yang mengehadkan dan mengasingkan sumber pengkomputeran (pemproses, rangkaian, sumber memori, sumber I/O) untuk kumpulan proses. Ringkasnya, mekanisme ini membolehkan anda mengurus sumber dalam bekas, dalam ingatan kes kami. Bagaimanakah Java berkaitan dengan ini? Ia adalah melalui mekanisme CGroups bahawa Java boleh melekat pada memori kontena. Tetapi ini semua bergantung pada versi Java. Sebagai contoh, Java 7 tidak tahu cara menggunakan CGroups , dan had bekas tidak diketahui olehnya. Secara lalai, saiz timbunan maksimum = ¼ memori fizikal. Jika aplikasi melebihi had kontena, maka akan ada OOM Killer , dan jika had kontena tidak ditetapkan, maka aplikasi akan mengambil memori dari aplikasi lain pada pelayan (lebih baik untuk menetapkan had, jika tidak semua orang akan kehilangan) . Anda boleh, sudah tentu, menggunakan tetapan timbunan atau menggunakan "imej" khas yang menyelesaikan masalah ini, tetapi cara paling mudah ialah menggunakan versi Java yang betul. Versi yang betul bermula dengan Java 8 x131 (dialihkan daripada Java 9), ia mula memahami CGroups . Dan dalam Java 10, sokongan untuk bekas muncul: UseContainerSupport , kemudian fungsi ini dialihkan ke Java 8 x 191 . Atau anda boleh menggunakan Java: 11+ . Apa yang boleh disimpulkan: Apabila menggunakan memori bekas, anda mungkin menerima OutOfMemoryError (OOM Error) atau OutOfMemoryKiller (OOM Killer). Dalam kes pertama, aplikasi tidak akan ranap serta-merta, Ralat OOM boleh ditangkap, tindakan diproses dan terkawal boleh diambil. Sebagai contoh, skala aplikasi. Jika Pembunuh OOM berlaku, aplikasi akan ranap serta-merta, dan tiada pilihan lagi untuk menyimpannya. Dan perkara yang paling teruk ialah secara luaran bekas itu sendiri akan baik-baik saja, iaitu, anda mungkin tidak mengesyaki bahawa sesuatu telah jatuh di sana. Mekanisme Linux digunakan untuk berinteraksi dengan bekas dan memori Java. Tetapi tidak setiap Java melaksanakannya. Untuk mengelakkan masalah untuk Java 8, anda perlu menggunakan versi bermula dari 131, atau lebih baik lagi, dari 191. Atau gunakan Java: 11+. Untuk latihan: OutOfMemoryError: tangkap jika anda boleh
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION