JavaRush /Java Blog /Random-ID /Panduan Mengelola Memori Java (dan Menyimpan Kode Anda)
pandaFromMinsk
Level 39
Минск

Panduan Mengelola Memori Java (dan Menyimpan Kode Anda)

Dipublikasikan di grup Random-ID
Catatan Penerjemah: keinginan untuk menerjemahkan catatan itu muncul pada suatu pagi di bulan Juni setelah membacanya setengah tertidur di gerbong kereta bawah tanah. Target audiens: orang-orang yang mengambil langkah pertama mereka di dunia Java dan, karena latar belakang atau keinginan teknis dasar mereka, sangat ingin mengenal Java dan mempelajari semua proses “elektrodinamik”. Saya yakin bagi yang membaca ini, ini akan menjadi titik awal perjalanan ke dunia konfigurasi JVM dan GC. Angin kencang! Artikel asli di sini Sebagai pengembang, Anda menghabiskan waktu berjam-jam untuk membersihkan bug dari aplikasi Java dan mendapatkan kinerja yang diperlukan. Selama pengujian, Anda melihat bahwa aplikasi secara bertahap berjalan lebih lambat, dan pada akhirnya aplikasi tersebut benar-benar crash atau hanya menunjukkan kinerja yang buruk. Akhirnya terimalah bahwa kebocoran memori terjadi. Pengumpul sampah Java melakukan yang terbaik untuk mengatasi kebocoran ini. Namun ada banyak hal yang bisa dilakukan saat menghadapi situasi seperti ini. Anda memerlukan cara untuk mengidentifikasi panggilan kebocoran memori, mengidentifikasi penyebab, dan memahami peran pengumpul sampah Java dalam memengaruhi kinerja aplikasi secara keseluruhan.

Gejala Utama Kebocoran Memori Java

Ada beberapa gejala yang menandakan suatu aplikasi mengalami masalah kebocoran memori. Sedikit penurunan kinerja, bukan kegagalan aplikasi secara tiba-tiba, hanya mengindikasikan kebocoran memori. Masalah dapat terjadi setiap saat selama pengoperasian atau hanya saat aplikasi mulai bekerja dengan data dalam jumlah besar, atau sebaliknya, Anda mulai menskalakan aplikasi. Aplikasi mungkin akan menampilkan kesalahan kehabisan memori setelah kebocoran menghabiskan semua sumber daya memori yang tersedia. Jika Anda memulai ulang aplikasi dan berharap yang terbaik, Anda akan mengalami crash berulang kali hingga kebocoran teratasi. Secara umum, kebocoran memori terjadi ketika referensi objek terakumulasi dan bukannya mengosongkan memori. Mereka menempati semua memori yang tersedia dan membuat aplikasi tidak dapat mengakses sumber daya yang dibutuhkannya.

Kesalahan konfigurasi muncul karena kebocoran memori

Sebelum Anda melihat situasi yang menyebabkan masalah memori Java dan melakukan analisis, Anda perlu memastikan bahwa penelitian tersebut tidak terkait dengan masalah yang sama sekali berbeda. Beberapa kesalahan kehabisan memori terjadi karena berbagai kesalahan, seperti kesalahan konfigurasi. Aplikasi mungkin kehabisan memori heap atau mungkin bertentangan dengan aplikasi lain di sistem. Jika Anda mulai berbicara tentang masalah memori rendah tetapi tidak tahu apa yang menyebabkan kebocoran, lihat aplikasinya secara berbeda. Anda akan menemukan bahwa Anda perlu membuat perubahan pada thread finalisasi atau menambah jumlah ruang generasi permanen, yang merupakan area memori JVM untuk menyimpan deskripsi kelas Java dan beberapa data tambahan.

Manfaat Alat Pemantauan Memori

Alat pemantauan memori memberikan visibilitas yang lebih besar ke dalam penggunaan sumber daya yang tersedia oleh aplikasi Java. Dengan menggunakan perangkat lunak ini, Anda mengambil langkah untuk mempersempit pencarian akar masalah kebocoran memori dan insiden kinerja lainnya. Alat-alat tersebut tersedia dalam beberapa kategori, dan Anda mungkin perlu menggunakan berbagai aplikasi untuk mengetahui cara menandai masalah dengan benar dan apa yang salah, bahkan jika Anda menghadapi kebocoran memori. File heap dump memberikan informasi yang diperlukan untuk menganalisis memori Java. Dalam hal ini, Anda perlu menggunakan dua alat: satu untuk menghasilkan file dump dan satu lagi untuk analisis mendetail. Solusi ini memberikan informasi rinci tentang apa yang terjadi dengan aplikasi. Setelah alat tersebut menunjukkan dengan tepat lokasi kemungkinan masalah dan berfungsi mempersempit area untuk menemukan lokasi pasti kejadian tersebut. Dan periode waktu ini adalah bagian trial and error yang paling lama dan paling menegangkan. Penganalisis memori menunjukkan beberapa masalah dalam kode Anda, namun Anda tidak benar-benar yakin masalah apa yang dihadapi aplikasi Anda. Jika Anda masih mengalami kesalahan yang sama, mulai lagi dari awal dan atasi kemungkinan kesalahan lainnya. Buat perubahan satu per satu dan coba duplikat kesalahannya. Anda perlu membiarkan aplikasi berjalan selama beberapa waktu untuk menduplikasi kondisi kesalahan. Jika ada kebocoran memori selama pengujian pertama, pastikan untuk memuat pengujian aplikasi. Sebuah aplikasi mungkin berfungsi dengan baik dengan jumlah data yang sedikit, namun mungkin akan menimbulkan kesalahan yang sama lagi saat bekerja dengan jumlah data yang besar. Jika kesalahan yang sama masih terjadi, Anda perlu memulai dari awal dan mencari kemungkinan penyebab lain. Alat pemantauan memori membuktikan kegunaannya setelah aplikasi beroperasi penuh. Anda dapat memantau kinerja JVM dari jarak jauh dan secara proaktif mendeteksi situasi kegagalan sebelum pengembang menyelami masalahnya dan mengumpulkan data kinerja historis untuk membantu meningkatkan teknik pemrograman mereka di masa depan dan melihat bagaimana kinerja Java di bawah beban berat. Banyak solusi yang menyertakan mode peringatan "bahaya" atau mode serupa lainnya sehingga pengembang dapat segera mengetahui apa yang salah. Setiap pengembang tidak ingin aplikasi penting, saat dalam produksi, mogok dan menyebabkan kerugian puluhan atau ratusan ribu dolar selama waktu henti aplikasi, sehingga alat pemantauan memori mengurangi waktu respons pengembang. Aplikasi pemantauan memori memungkinkan Anda memulai proses diagnostik secara instan, alih-alih meminta Anda pergi ke pelanggan, di mana tidak ada yang akan memberi tahu Anda secara pasti kesalahan apa yang terjadi atau kode kesalahan apa yang dihasilkan aplikasi. Jika Anda sering mendapati diri Anda tenggelam dalam masalah memori dan kinerja aplikasi Java, pelajari lebih dalam proses pengujiannya. Identifikasi setiap area lemah dalam proses pengembangan dan ubah strategi pengujian Anda. Konsultasikan dengan kolega dan bandingkan pendekatan pengujian Anda dengan praktik terbaik yang ada. Terkadang Anda perlu merevisi sebagian kecil kode dan kemudian memastikan dampak jangka panjang pada keseluruhan aplikasi.

Peran Pengumpul Sampah pada Memori Java dan Kebocoran Memori

Pengumpul Sampah di Java memainkan peran penting dalam kinerja aplikasi dan penggunaan memori. Ia mencari objek yang tidak terpakai (mati) dan menghapusnya. Objek ini tidak lagi menempati memori, sehingga aplikasi Anda terus memastikan ketersediaan sumber daya. Terkadang aplikasi tidak memberikan cukup waktu atau sumber daya kepada GC untuk menghilangkan objek mati dan objek tersebut menumpuk. Anda mungkin menghadapi situasi di mana ada akses aktif ke objek yang Anda yakini sudah mati. Pemulung tidak bisa berbuat apa-apa karena... mekanisme manajemen memori otomatisnya melewati objek aktif. Biasanya pengumpul sampah beroperasi secara mandiri, namun Anda perlu menyesuaikan perilakunya untuk merespons masalah memori yang parah. Namun, GC sendiri dapat menyebabkan masalah kinerja.

area GC

Pengumpul sampah memisahkan objek ke dalam area berbeda untuk mengoptimalkan perakitan. Generasi Muda menampilkan benda-benda yang cepat mati. Para pemulung sering bekerja di kawasan ini karena harus membersihkan. Benda yang tetap hidup setelah mencapai jangka waktu tertentu akan dipindahkan ke Generasi Lama. Di kawasan Generasi Lama, benda-benda tersebut bertahan lama dan tidak sering diambil oleh kolektor. Namun, saat pengumpul berjalan dalam cakupan tersebut, aplikasi akan menjalani operasi besar di mana pengumpul melihat melalui objek hidup untuk membersihkan sampah. Akibatnya, objek aplikasi terletak di area pembangkitan permanen akhir. Biasanya, objek ini menyertakan metadata JVM yang diperlukan. Aplikasi ini tidak menghasilkan banyak sampah pada Generasi Permanen, tetapi memerlukan kolektor untuk menghapus kelas ketika kelas tersebut tidak lagi diperlukan.

Hubungan antara Pengumpul Sampah dan waktu tanggap

Pengumpul sampah, terlepas dari prioritas eksekusi thread aplikasi, menghentikannya tanpa menunggu penyelesaian. Fenomena ini disebut dengan peristiwa “Hentikan Dunia”. Wilayah Generasi Muda dari pengumpul sampah memiliki dampak kecil terhadap kinerja, namun masalah akan terlihat jika GC melakukan pembersihan intensif. Anda berakhir dalam situasi di mana GC minor Generasi Muda terus berjalan atau Generasi Tua berada dalam kondisi tidak terkendali. Dalam situasi seperti ini, Anda perlu menyeimbangkan frekuensi Generasi Muda dengan kinerja yang memerlukan peningkatan ukuran area kolektor ini. Wilayah pengumpul sampah Generasi Permanen dan Generasi Lama memiliki dampak yang signifikan terhadap kinerja aplikasi dan penggunaan memori. Operasi pembersihan sampah besar-besaran ini dilakukan melalui tumpukan untuk mengeluarkan benda mati. Prosesnya memerlukan waktu lebih lama dibandingkan build minor dan dampak performanya mungkin memerlukan waktu lebih lama. Ketika intensitas scrubbing tinggi dan ukuran area Generasi Lama besar, kinerja seluruh aplikasi terhenti karena peristiwa "Hentikan dunia". Mengoptimalkan pengumpulan sampah memerlukan pemantauan seberapa sering program dijalankan, dampaknya terhadap kinerja secara keseluruhan, dan cara menyesuaikan pengaturan aplikasi untuk mengurangi frekuensi pemantauan. Anda mungkin perlu mengidentifikasi objek yang sama yang ditempatkan lebih dari satu kali tanpa aplikasi harus memisahkan diri dari penempatannya, atau Anda mungkin perlu menemukan titik kompresi yang menahan seluruh sistem. Mendapatkan keseimbangan yang tepat memerlukan perhatian yang cermat terhadap segala hal mulai dari beban CPU hingga siklus pengumpul sampah, terutama jika Generasi Muda dan Tua tidak seimbang. Mengatasi kebocoran memori dan mengoptimalkan pengumpulan sampah membantu meningkatkan kinerja aplikasi Java. Anda benar-benar menyulap banyak bagian yang bergerak. Namun dengan pendekatan pemecahan masalah yang tepat dan alat analisis yang dirancang untuk memberikan visibilitas yang ketat, Anda akan mencapai titik terang. Jika tidak, Anda akan mengalami masalah terkait kinerja. Penempatan dan pemantauan memori yang cermat memainkan peran penting dalam aplikasi Java. Anda perlu mengambil kendali penuh atas interaksi antara pengumpulan sampah, pembuangan objek, dan kinerja untuk mengoptimalkan aplikasi Anda dan menghindari kesalahan kehabisan memori. Alat pemantauan membantu Anda tetap mengetahui potensi masalah dan menyoroti tren penggunaan memori sehingga Anda mengambil pendekatan proaktif dalam pemecahan masalah. Kebocoran memori sering kali menunjukkan ketidakefektifan pemecahan masalah normal, terutama jika Anda menemukan nilai parameter konfigurasi yang salah, namun mengatasi masalah memori dapat membantu Anda dengan cepat menghindari insiden yang menghalangi Anda. Kesempurnaan penyetelan memori Java dan GC membuat proses pengembangan Anda lebih mudah.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION