JavaRush /Blog Java /Random-MS /Panduan untuk Mengurus Memori Java (dan Menyimpan Kod And...
pandaFromMinsk
Tahap
Минск

Panduan untuk Mengurus Memori Java (dan Menyimpan Kod Anda)

Diterbitkan dalam kumpulan
Nota penterjemah: keinginan untuk menterjemah nota itu muncul pada awal pagi Jun selepas membacanya separuh tertidur di dalam kereta bawah tanah. Penonton sasaran: orang yang mengambil langkah pertama mereka di dunia Jawa dan, kerana sifat latar belakang teknikal asas atau keinginan mereka, sangat bersemangat untuk menguasai Java dan mempelajari semua proses "elektrodinamik". Saya pasti bahawa bagi mereka yang membaca ini, ini akan menjadi titik permulaan untuk perjalanan ke dunia mengkonfigurasi JVM dan GC. Angin yang adil! Artikel asal di sini Sebagai pembangun, anda menghabiskan berjam-jam membersihkan pepijat daripada aplikasi Java dan memperoleh prestasi di tempat yang sepatutnya. Semasa ujian, anda dapati bahawa aplikasi secara beransur-ansur berjalan lebih perlahan, dan akhirnya ia ranap sepenuhnya atau hanya menunjukkan prestasi yang lemah. Akhirnya terima bahawa kebocoran memori berlaku. Java pengumpul sampah melakukan yang terbaik untuk menangani kebocoran ini. Tetapi hanya banyak perkara yang boleh dilakukan apabila berhadapan dengan situasi seperti ini. Anda memerlukan cara untuk mengenal pasti panggilan kebocoran memori, mengenal pasti punca dan memahami peranan pengumpul sampah Java dalam mempengaruhi prestasi aplikasi keseluruhan.

Gejala Utama Kebocoran Memori Java

Terdapat beberapa gejala yang menunjukkan bahawa aplikasi mempunyai masalah kebocoran memori. Penurunan sedikit dalam prestasi, bukannya kegagalan aplikasi secara tiba-tiba, hanya menunjukkan kebocoran memori. Masalah boleh berlaku setiap kali semasa operasi atau hanya apabila aplikasi mula berfungsi dengan sejumlah besar data atau, sebaliknya, anda mula menskalakan aplikasi. Aplikasi mungkin akan menunjukkan ralat kehabisan memori apabila kebocoran telah menggunakan semua sumber memori yang tersedia. Jika anda memulakan semula aplikasi dan mengharapkan yang terbaik, anda akan menghadapi ranap sistem berulang sehingga kebocoran diperbaiki. Secara umum, kebocoran memori berlaku apabila rujukan objek terkumpul dan bukannya membebaskan memori. Mereka menduduki semua memori yang ada dan menjadikannya mustahil untuk aplikasi mengakses sumber yang diperlukan.

Ralat konfigurasi muncul sebagai kebocoran memori

Sebelum anda melihat situasi yang menyebabkan masalah ingatan Java dan menjalankan analisis, anda perlu memastikan bahawa penyelidikan tidak berkaitan dengan masalah yang sama sekali berbeza. Beberapa ralat di luar ingatan berlaku disebabkan oleh pelbagai ralat, seperti ralat konfigurasi. Aplikasi mungkin rendah pada ingatan timbunan atau mungkin bercanggah dengan aplikasi lain pada sistem. Jika anda mula bercakap tentang isu ingatan tetapi tidak dapat mengetahui apa yang menyebabkan kebocoran, lihat aplikasi yang berbeza. Anda akan mendapati bahawa anda perlu membuat perubahan pada utas akhir atau meningkatkan jumlah ruang penjanaan kekal, yang merupakan kawasan memori JVM untuk menyimpan penerangan kelas Java dan beberapa data tambahan.

Faedah Alat Pemantauan Memori

Alat pemantauan memori memberikan keterlihatan yang lebih besar ke dalam penggunaan sumber yang tersedia oleh aplikasi Java. Dengan menggunakan perisian ini, anda mengambil langkah ke arah mengecilkan pencarian punca masalah kebocoran memori dan insiden prestasi lain. Alat ini datang dalam beberapa kategori, dan anda mungkin perlu menggunakan pelbagai aplikasi untuk memikirkan cara untuk membenderakan masalah dengan betul dan perkara yang salah, walaupun anda berhadapan dengan kebocoran memori. Fail longgokan timbunan menyediakan maklumat yang diperlukan untuk menganalisis memori Java. Dalam kes ini, anda perlu menggunakan dua alat: satu untuk menjana fail dump dan satu lagi untuk analisis terperinci. Penyelesaian ini memberikan maklumat terperinci tentang perkara yang berlaku dengan aplikasi. Sebaik sahaja alat itu menentukan lokasi kemungkinan masalah dan berfungsi untuk mengecilkan kawasan tersebut untuk mengetahui lokasi sebenar kejadian. Dan tempoh masa ini adalah masa bahagian percubaan dan kesilapan yang paling lama dan paling menyedihkan. Penganalisis memori menunjukkan beberapa masalah dalam kod anda, tetapi anda tidak pasti sepenuhnya masalah yang dihadapi oleh aplikasi anda. Jika anda masih mengalami ralat yang sama, mulakan semula dan kerjakan ralat lain yang mungkin. Buat satu perubahan pada satu masa dan cuba buat pendua ralat. Anda perlu membiarkan aplikasi berjalan untuk beberapa waktu untuk menduplikasi keadaan ralat. Jika terdapat kebocoran memori semasa ujian pertama, pastikan anda memuatkan ujian aplikasi. Aplikasi mungkin berfungsi dengan baik dengan jumlah data yang kecil, tetapi mungkin sekali lagi membuang ralat yang sama apabila bekerja dengan jumlah data yang besar. Jika ralat yang sama masih berlaku, anda perlu memulakan semula dan mencari sebab lain yang mungkin. Alat pemantauan memori membuktikan kegunaannya sebaik sahaja aplikasi beroperasi sepenuhnya. Anda boleh memantau prestasi JVM dari jauh dan mengesan situasi kegagalan secara proaktif sebelum pembangun menyelami masalah dan mengumpul data prestasi sejarah untuk membantu meningkatkan teknik pengaturcaraan mereka pada masa hadapan dan melihat prestasi Java di bawah beban yang berat. Banyak penyelesaian termasuk mod amaran "bahaya" atau mod lain yang serupa supaya pembangun dapat mengetahui dengan segera perkara yang salah. Setiap pembangun tidak mahu aplikasi kritikal, semasa dalam pengeluaran, ranap dan menyebabkan kerugian berpuluh atau ratusan ribu dolar semasa masa henti aplikasi, jadi alat pemantauan memori mengurangkan masa tindak balas pembangun. Aplikasi pemantauan memori membolehkan anda memulakan proses diagnostik serta-merta, bukannya meminta anda pergi kepada pelanggan, di mana tiada siapa yang akan memberitahu anda dengan tepat apa ralat yang berlaku atau apa kod ralat yang dihasilkan oleh aplikasi. Jika anda sering mendapati diri anda tenggelam dalam masalah memori dan prestasi aplikasi Java anda, selami proses ujian yang mendalam. Kenal pasti setiap kawasan yang lemah dalam proses pembangunan dan ubah strategi ujian anda. Rujuk dengan rakan sekerja dan bandingkan pendekatan ujian anda dengan amalan terbaik sedia ada. Kadangkala anda perlu menyemak sekeping kod kecil dan kemudian memastikan kesan yang berkekalan pada keseluruhan aplikasi.

Peranan Pengumpul Sampah pada Memori Java dan Kebocoran Memori

Pengumpul Sampah di Java memainkan peranan penting dalam prestasi aplikasi dan penggunaan memori. Ia mencari objek yang tidak digunakan (mati) dan memadamkannya. Objek ini tidak lagi menduduki memori, jadi aplikasi anda terus memastikan ketersediaan sumber. Kadangkala aplikasi tidak memberikan masa atau sumber yang cukup kepada GC untuk mengalih keluar objek mati dan ia terkumpul. Anda mungkin menghadapi situasi di mana terdapat akses aktif kepada objek yang anda percaya sudah mati. Pengumpul sampah tidak boleh berbuat apa-apa tentang perkara ini kerana... mekanisme pengurusan memori automatiknya memintas objek aktif. Biasanya pemungut sampah beroperasi secara autonomi, tetapi anda perlu menyesuaikan tingkah lakunya untuk bertindak balas terhadap masalah ingatan yang teruk. Walau bagaimanapun, GC sendiri boleh menyebabkan masalah prestasi.

kawasan GC

Pengumpul sampah mengasingkan objek ke kawasan yang berbeza untuk mengoptimumkan pemasangan. Generasi Muda menampilkan objek yang cepat pupus. Pengumpul sampah sering bekerja di kawasan ini sejak dia perlu membersihkannya. Objek yang masih hidup selepas mencapai tempoh tertentu dipindahkan ke Generasi Lama. Di kawasan Generasi Lama, objek kekal untuk masa yang lama dan tidak dikeluarkan oleh pengumpul sekerap. Walau bagaimanapun, apabila pengumpul berjalan dalam skop, aplikasi melalui operasi besar di mana pengumpul melihat melalui objek hidup untuk membersihkan sampah. Akibatnya, objek aplikasi terletak di kawasan penjanaan kekal akhir. Biasanya, objek ini termasuk metadata JVM yang diperlukan. Aplikasi ini tidak menjana banyak sampah dalam Penjanaan Kekal, tetapi memerlukan pengumpul untuk mengalih keluar kelas apabila kelas tidak lagi diperlukan.

Hubungan antara Pemungut Sampah dan masa tindak balas

Pengumpul sampah, tanpa mengira keutamaan pelaksanaan utas aplikasi, menghentikannya tanpa menunggu selesai. Fenomena ini dipanggil acara "Stop the World". Kawasan Generasi Muda pengumpul sampah mempunyai kesan kecil pada prestasi, tetapi masalah ketara jika GC melakukan pembersihan intensif. Anda akan berada dalam situasi di mana GC minor Generasi Muda sentiasa berjalan atau Generasi Lama berada dalam keadaan tidak terkawal. Dalam keadaan sedemikian, anda perlu mengimbangi frekuensi Generasi Muda dengan prestasi yang memerlukan peningkatan saiz kawasan pengumpul ini. Kawasan Generasi Kekal dan Generasi Lama bagi pemungut sampah mempunyai kesan yang signifikan terhadap prestasi aplikasi dan penggunaan memori. Operasi pembersihan sampah utama ini melalui timbunan untuk menolak objek mati. Proses ini mengambil masa lebih lama daripada binaan kecil dan kesan prestasi mungkin mengambil masa lebih lama. Apabila keamatan gosokan tinggi dan saiz kawasan Generasi Lama besar, prestasi keseluruhan aplikasi tersekat disebabkan oleh peristiwa "Hentikan dunia". Mengoptimumkan kutipan sampah memerlukan pemantauan kekerapan program dijalankan, kesan ke atas prestasi keseluruhan dan cara melaraskan tetapan aplikasi untuk mengurangkan kekerapan pemantauan. Anda mungkin perlu mengenal pasti objek yang sama diletakkan lebih daripada sekali tanpa aplikasi perlu memagar dirinya daripada peletakan, atau anda mungkin perlu mencari titik mampatan yang menahan keseluruhan sistem. Mendapatkan keseimbangan yang betul memerlukan perhatian yang teliti terhadap segala-galanya daripada beban CPU kepada kitaran pemungut sampah anda, terutamanya jika Generasi Muda dan Lama tidak seimbang. Menangani kebocoran memori dan mengoptimumkan pengumpulan sampah membantu meningkatkan prestasi aplikasi Java. Anda benar-benar menyulap banyak bahagian yang bergerak. Tetapi dengan pendekatan penyelesaian masalah yang betul dan alat analisis yang direka untuk memberikan keterlihatan yang rapi, anda akan mencapai cahaya di penghujung terowong. Jika tidak, anda akan mengalami masalah berkaitan prestasi. Peletakan dan pemantauan memori yang teliti memainkan peranan penting dalam aplikasi Java. Anda perlu mengawal sepenuhnya interaksi antara pengumpulan sampah, pelupusan objek dan prestasi untuk mengoptimumkan aplikasi anda dan mengelakkan ralat kehabisan memori. Alat pemantauan membantu anda sentiasa mengetahui potensi masalah dan menyerlahkan arah aliran penggunaan memori supaya anda mengambil pendekatan proaktif untuk menyelesaikan masalah. Kebocoran memori sering menunjukkan ketidakberkesanan menyelesaikan masalah dengan cara biasa, terutamanya jika anda menghadapi nilai parameter konfigurasi yang salah, tetapi menyelesaikan isu berkaitan memori boleh membantu anda mengelakkan insiden yang menghalang anda dengan cepat. Kesempurnaan penalaan memori Java dan GC menjadikan proses pembangunan anda lebih mudah.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION