JavaRush /Java Blog /Random-ID /Rehat kopi #210. Semua Jenis Pemulung di Jawa Yang Harus ...

Rehat kopi #210. Semua Jenis Pemulung di Jawa Yang Harus Anda Ketahui

Dipublikasikan di grup Random-ID
Sumber: Hackernoon Melalui postingan ini, Anda akan mempelajari kekuatan dan kelemahan setiap jenis pengumpul sampah yang digunakan dalam pengembangan Java. Rehat kopi #210.  Semua Jenis Pemulung di Jawa Yang Harus Anda Ketahui - 1Pertanyaan tentang Pengumpul Sampah (GC) terdengar hampir di setiap wawancara. Jadi saya memutuskan untuk mengumpulkan semua informasi yang diperlukan tentang mereka menggunakan prinsip favorit saya - singkat dan sederhana. Pertama, mari kita mulai dengan tujuan CG dan mengapa kita memerlukan berbagai jenis pengumpul sampah. Dalam bahasa seperti C, kita perlu menyimpan informasi objek dalam memori dan menulis banyak kode boilerplate untuk mengosongkan memori tersebut. Tentu saja, kebocoran memori sering terjadi pada program semacam itu. Java memecahkan masalah kebocoran memori menggunakan pengumpul sampah. Dan Anda, sebagai pengembang, harus mengetahui pengumpul sampah mana yang terbaik untuk digunakan. Banyak hal bergantung pada di mana dan bagaimana program Anda dijalankan. Ini mungkin berjalan pada perangkat keras yang lemah atau dengan sejumlah besar objek, atau program Anda harus sangat cepat. Berdasarkan kondisi ini, Anda harus menyetel pengumpul sampah Anda untuk mencapai kinerja yang diinginkan. Jadi, mari kita mulai.

Bagaimana JVM menangani memori

Java Virtual Machine (JVM) membagi memori menjadi dua area: heap, yang menyimpan data aplikasi, dan non-heap, yang menyimpan kode program dan data lainnya. Mari kita alihkan perhatian kita ke area heap. Di sinilah program kita membuat objek baru. Semua pengumpul sampah didasarkan pada kenyataan bahwa banyak program menggunakan objek fana. Artinya, benda-benda tersebut diciptakan, kemudian memenuhi fungsinya dan tidak diperlukan lagi. Mayoritas objek tersebut. Namun beberapa objek dapat bertahan lebih lama, bahkan mungkin sepanjang durasi program. Dari sinilah muncul ide untuk membagi objek menjadi generasi muda dan tua. Dan kita perlu sering memeriksa generasi muda. Faktanya, proses pengumpulan sampah terbagi menjadi pembersihan kecil, yang hanya berdampak pada generasi muda, dan pembersihan menyeluruh, yang dapat berdampak pada kedua generasi. Ingatlah bahwa pengumpul sampah adalah sebuah program. Dan itu memerlukan waktu dan sumber daya dari komputer Anda agar dapat berfungsi. Yang juga mempengaruhi aplikasi kita. Bagaimana pengaruhnya? Misalnya, untuk melakukan pengumpulan sampah, JVM menghentikan sementara aplikasi kita. Ini disebut jeda Stop-The-World (STW). Selama waktu ini, semua rangkaian aplikasi ditangguhkan. Namun aplikasi di dalamnya sama sekali tidak menyadari hal ini. Untuk penerapannya, waktu mengalir secara merata. Mengapa ini sangat buruk? Bayangkan saja, Anda sedang menulis semacam aplikasi pertukaran atau aplikasi autopilot pesawat. Aplikasi Anda dapat memasuki mode tidur selama satu detik, dan sifat masalah Anda dapat berubah secara dramatis. Artinya, jeda merupakan parameter penting bagi setiap pemulung. Properti mendasar berikutnya dari pengumpul sampah adalah total waktu yang dihabiskan untuk mengumpulkan sampah dibandingkan dengan total waktu pelaksanaan program. Apa artinya ini dan mengapa ini sangat penting? Daripada menggunakan satu fase besar “Hentikan Dunia”, kita dapat memilih algoritma dengan banyak jeda kecil. Istirahat kecil lebih disukai, tetapi tidak ada yang gratis. Dalam hal ini, kami membayar dengan menambah total waktu eksekusi program. Dan kita juga harus memperhitungkan hal ini. Parameter selanjutnya adalah jumlah sumber daya perangkat keras. Setiap kolektor memerlukan memori untuk menyimpan informasi objek dan prosesor untuk melakukan pembersihan. Parameter terakhir adalah kecepatan. Efisiensi pengumpulan sampah mengacu pada seberapa cepat dan efisien pengumpul sampah (GC) mengambil kembali memori yang tidak lagi digunakan oleh suatu program. Semua parameter ini memengaruhi algoritme, yang dapat mengosongkan memori secepat mungkin dengan mengonsumsi sumber daya minimal. Mari kita lihat pemulung yang tersedia bagi kita. Untuk wawancara Anda perlu mengetahui lima yang pertama. Dua lainnya jauh lebih sulit.

Serial GC

Serial GC adalah pengumpul sampah Java Virtual Machine dan telah digunakan sejak awal Java. Ini berguna untuk program dengan heap kecil dan berjalan pada mesin yang kurang bertenaga. Pengumpul sampah ini membagi tumpukan menjadi beberapa wilayah, termasuk Eden dan Survivor. Wilayah Eden adalah kumpulan tempat memori untuk sebagian besar objek awalnya dialokasikan. Survivor merupakan kolam berisi benda-benda yang selamat dari pengumpulan sampah di kawasan Eden. Saat tumpukan terisi, objek dipindahkan antara wilayah Eden dan Survivor. JVM terus memantau pergerakan objek ke wilayah Survivor dan memilih ambang batas yang sesuai untuk jumlah pergerakan tersebut, setelah itu objek dipindahkan ke wilayah Tenured. Ketika tidak ada cukup ruang di wilayah yang dikuasai, pengumpulan sampah secara penuh mengambil alih, mengerjakan objek-objek dari kedua generasi. Keuntungan utama dari pengumpul sampah ini adalah kebutuhan sumber dayanya yang rendah, sehingga prosesor berdaya rendah sudah cukup untuk melakukan pengumpulan. Kerugian utama dari Serial GC adalah jeda yang lama selama pengumpulan sampah, terutama jika menyangkut data dalam jumlah besar.

CG Paralel

Pengumpul sampah paralel (Parallel CG) mirip dengan konstruktor sekuensial. Ini mencakup pemrosesan paralel beberapa tugas dan kemampuan untuk menyesuaikan pengaturan kinerja secara otomatis. Parallel GC adalah pengumpul sampah Mesin Virtual Java berdasarkan ide Serial GC, tetapi dengan tambahan paralelisme dan kecerdasan. Jika komputer memiliki lebih dari satu inti prosesor, versi JVM yang lebih lama secara otomatis memilih Parallel GC. Heap di sini dibagi menjadi wilayah yang sama seperti di Serial GC - Eden, Survivor 0, Survivor 1, dan Old Gen (Tenured). Namun, beberapa thread berpartisipasi dalam pengumpulan sampah secara paralel, dan kolektor dapat menyesuaikan dengan parameter kinerja yang diperlukan. Setiap thread kolektor memiliki area memori yang perlu dibersihkan. Parallel GC juga memiliki pengaturan yang bertujuan untuk mencapai efisiensi pengumpulan sampah yang diperlukan. Pengumpul menggunakan statistik dari pengumpulan sampah sebelumnya untuk menyesuaikan pengaturan kinerja pengumpulan sampah di masa mendatang. GC Paralel menyediakan penyetelan otomatis parameter kinerja dan waktu jeda build yang lebih rendah, namun ada satu kelemahan kecil dalam bentuk beberapa fragmentasi memori. Ini cocok untuk sebagian besar aplikasi, tetapi untuk program yang lebih kompleks, lebih baik memilih implementasi pengumpul sampah yang lebih canggih. Kelebihan: Lebih cepat dari Serial GC dalam banyak kasus. Memiliki kecepatan yang baik. Kekurangan: Menghabiskan lebih banyak sumber daya dan jeda bisa cukup lama, namun kita dapat menyesuaikan durasi jeda maksimum Stop-The-World.

Sapu Tanda Bersamaan

Pengumpul sampah Concurrent Mark Sweep (CMS) bertujuan untuk mengurangi durasi jeda maksimum dengan menjalankan beberapa tugas pengumpulan sampah secara bersamaan dengan thread aplikasi. Pengumpul sampah ini cocok untuk mengelola data dalam jumlah besar di memori. Concurrent Mark Sweep (CMS) adalah alternatif Parallel GC di Java Virtual Machine (JVM). Ini ditujukan untuk aplikasi yang memerlukan akses ke beberapa inti prosesor dan sensitif terhadap jeda Stop-The-World. CMS melakukan langkah-langkah pengumpulan sampah secara paralel dengan program utama, yang memungkinkannya berjalan tanpa henti. Ia menggunakan organisasi memori yang sama dengan kolektor Serial dan Paralel, namun tidak menunggu hingga area Tenured terisi sebelum menjalankan pembersihan generasi lama. Sebaliknya, ini berjalan di latar belakang dan mencoba untuk menjaga wilayah Tenured tetap kompak. Sapuan Tanda Bersamaan dimulai dengan fase penandaan awal yang menghentikan sebentar thread utama aplikasi dan menandai semua objek yang dapat diakses dari root. Thread utama aplikasi kemudian dilanjutkan dan CMS mulai mencari semua objek aktif yang dapat diakses melalui tautan dari objek akar yang ditandai. Setelah menandai semua benda hidup, kolektor membersihkan memori benda mati dalam beberapa rangkaian paralel. Salah satu manfaat CMS adalah fokusnya pada meminimalkan downtime, yang sangat penting bagi banyak aplikasi. Namun, hal ini membutuhkan pengorbanan dalam hal sumber daya CPU dan bandwidth secara keseluruhan. Selain itu, CMS tidak memampatkan objek generasi lama, yang menyebabkan fragmentasi. Jeda yang lama karena kemungkinan kegagalan mode paralel dapat menjadi kejutan yang tidak menyenangkan (walaupun hal itu tidak sering terjadi). Jika terdapat cukup memori, CMS dapat menghindari jeda tersebut. Kelebihan: Cepat. Memiliki jeda kecil Stop-The-World. Kontra: menghabiskan lebih banyak memori; jika memori tidak mencukupi, beberapa jeda mungkin akan lama. Kurang bagus jika aplikasi membuat banyak objek.

Sampah-Pertama

Garbage-First (G1) dianggap sebagai alternatif CMS, terutama untuk aplikasi server yang berjalan pada server multiprosesor dan mengelola kumpulan data besar. Pengumpul sampah G1 mengubah memori menjadi beberapa wilayah berukuran sama, dengan pengecualian wilayah yang sangat besar (yang dibuat dengan menggabungkan wilayah biasa untuk menampung objek berukuran besar). Daerah tidak harus tersusun secara berjajar dan dapat berganti-ganti afiliasi generasinya. Pembersihan kecil-kecilan dilakukan secara berkala untuk generasi muda dan memindahkan objek ke wilayah Survivor atau meningkatkannya ke generasi yang lebih tua dan memindahkannya ke Tenured. Pembersihan hanya dilakukan di area yang perlu dihindari melebihi waktu yang diinginkan. Pengumpul sendiri memperkirakan dan memilih daerah dengan jumlah sampah terbanyak untuk dibersihkan. Sapuan penuh menggunakan loop penandaan untuk membuat daftar objek aktif yang berjalan secara paralel dengan aplikasi utama. Setelah siklus penandaan, G1 beralih menjalankan pembersihan campuran, yang menambahkan wilayah generasi tua ke kumpulan wilayah generasi muda yang akan dibersihkan. Pengumpul sampah G1 dianggap lebih akurat dibandingkan pengumpul CMS dalam memprediksi ukuran jeda dan mendistribusikan pengumpulan sampah dengan lebih baik dari waktu ke waktu untuk mencegah waktu henti aplikasi yang lama, terutama dengan ukuran tumpukan yang besar. Itu juga tidak memecah memori seperti kolektor CMS. Namun, kolektor G1 memerlukan lebih banyak sumber daya CPU untuk berjalan secara paralel dengan program utama, sehingga mengurangi throughput aplikasi. Kelebihan: Bekerja lebih baik daripada CMS. Memiliki jeda yang lebih pendek. Kekurangan: Memakan lebih banyak sumber daya CPU. Juga memakan lebih banyak memori jika kita memiliki banyak objek yang cukup besar (lebih dari 500 KB) karena menempatkan objek tersebut dalam satu wilayah (1-32 MB).

Epsilon GC

Epsilon GC dirancang untuk situasi di mana pengumpulan sampah tidak diperlukan. Itu tidak melakukan pengumpulan sampah, tetapi menggunakan TLAB (buffer alokasi lokal thread) untuk mengalokasikan objek baru - buffer memori kecil yang diminta oleh masing-masing thread dari heap. Objek besar yang tidak sesuai dengan buffer meminta blok memori khusus untuk dirinya sendiri. Ketika Epsilon GC kehabisan sumber daya, OutOfMemoryError dihasilkan dan proses dihentikan. Keuntungan Epsilon GC mencakup kebutuhan sumber daya yang lebih rendah dan alokasi memori yang lebih cepat untuk aplikasi yang membuat semua objek yang diperlukan saat startup atau menjalankan aplikasi berumur pendek yang tidak menggunakan semua memori yang dialokasikan. Epsilon GC juga dapat membantu menganalisis kebutuhan sumber daya yang ditambahkan oleh pengumpul sampah lain ke aplikasi Anda. Kelebihan: Sangat cepat. Kekurangan: Tidak dapat membersihkan objek :) Dua kolektor berikutnya adalah yang paling canggih di antara jenisnya, namun juga paling rumit. Oleh karena itu, kami akan mempertimbangkannya secara singkat.

ZGC

ZGC dapat mempertahankan latensi sub-milidetik bahkan ketika menangani data dalam jumlah besar. ZGC adalah pengumpul sampah yang dikembangkan oleh Oracle untuk Java yang dirancang untuk memberikan throughput tinggi dan latensi rendah saat memproses tumpukan besar (hingga 16 TB). ZGC didasarkan pada prinsip memori virtual dan menggunakan tanda warna berbeda untuk melacak keadaan objek selama pengumpulan sampah. Kelebihan: Jeda kurang dari satu milidetik, bahkan pada tumpukan besar, yang sangat berguna untuk aplikasi yang memerlukan waktu pemrosesan kueri singkat. Ia bekerja dengan tumpukan yang sangat besar dengan throughput yang baik. ZGC dapat memampatkan memori heap selama pengumpulan sampah. Kekurangan: Penggunaan CPU yang tinggi dan persyaratan kinerja yang signifikan, yang dapat memperlambat waktu peluncuran aplikasi.

Shenandoah G.C.

Shenandoah GC adalah pengumpul sampah lainnya dengan jeda singkat berapa pun ukuran tumpukannya. Pengumpul sampah ini dikembangkan oleh Red Hat. Hal ini dirancang untuk meminimalkan waktu yang dihabiskan aplikasi pada pengumpulan sampah. Seperti ZGC, ini adalah kolektor paralel, artinya ia berjalan saat aplikasi sedang berjalan, meminimalkan jeda. Shenandoah GC menggunakan “penunjuk penerusan” untuk memindahkan objek selama pengumpulan sampah. Ia juga memiliki teknik yang disebut “penghilangan penghalang beban” untuk meningkatkan kinerja. Kelebihan: Shenandoah GC dapat mencapai waktu jeda yang singkat, seringkali kurang dari 10 md, bahkan untuk tumpukan yang sangat besar. Throughput yang bagus. Kekurangan: beban prosesor yang tinggi dan kesulitan dalam bekerja di bawah beban yang berat.

Kesimpulan

Pengumpul sampah adalah salah satu tugas tersulit dalam pemrograman. Perkembangan baru terus dilakukan ke arah ini. Meskipun jarang ada pemrogram yang mengubah GC, Anda tetap harus memiliki setidaknya pengetahuan sekilas tentang cara kerja alat pengumpulan sampah Anda.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION