Alalahanin kung ano ang koleksyon ng basura sa Java
Ang pangongolekta ng basura ay ang proseso ng pagbawi ng buong runtime memory sa pamamagitan ng pagsira sa mga hindi nagamit na bagay.
Minsan ang programmer ay maaaring makalimutan na sirain ang mga walang silbi na bagay, at ang memorya na inilalaan sa kanila ay hindi napalaya. Parami nang parami ang memorya ng system na natupok, at kalaunan ay wala nang inilalaan. Ang ganitong mga application ay dumaranas ng "mga pagtagas ng memorya".
Pagkatapos ng isang tiyak na punto, wala nang sapat na memorya upang lumikha ng mga bagong bagay at ang programa ay nagwawakas nang abnormal dahil sa OutOfMemoryError .
Ang pangongolekta ng basura sa Java ay ang proseso kung saan ang mga Java program ay awtomatikong namamahala ng memorya. Ang mga Java program ay pinagsama-sama sa bytecode na tumatakbo sa Java Virtual Machine (JVM).
Kapag tumatakbo ang mga Java program sa JVM, ang mga bagay ay nilikha sa heap, na siyang bahagi ng memorya na inilalaan sa kanila.
Habang tumatakbo ang isang Java application, ang mga bagong bagay ay nilikha dito. Sa huli, ang ilang mga bagay ay hindi na kailangan. Masasabi nating sa anumang oras, ang heap memory ay binubuo ng dalawang uri ng mga bagay.
- Live - Ang mga bagay na ito ay ginagamit, ang mga ito ay isinangguni mula sa ibang lugar.
- Patay - ang mga bagay na ito ay hindi ginagamit saanman, walang mga sanggunian sa kanila.
Hinahanap ng tagakolekta ng basura ang mga hindi nagamit na bagay na ito at inaalis ang mga ito upang palayain ang memorya.
Ang pangongolekta ng basura sa Java ay isang awtomatikong proseso . Ang programmer ay hindi kailangang tahasang markahan ang mga bagay na tatanggalin.
Ang bawat JVM ay maaaring magpatupad ng sarili nitong bersyon ng koleksyon ng basura. Gayunpaman, ang kolektor ay dapat sumunod sa karaniwang detalye ng JVM para sa pagharap sa mga bagay na nasa heap memory upang markahan o kilalanin ang mga bagay na hindi maabot at sirain ang mga ito sa pamamagitan ng compaction.
Maabot ng Bagay
Upang makilala ang isang bagay bilang buhay, ang pagkakaroon ng mga link ay hindi sapat. Ito ay dahil ang ilang mga patay na bagay ay maaaring tumukoy sa iba pang mga patay na bagay. Iyon ang dahilan kung bakit kinakailangan na sa lahat ng mga sanggunian sa isang bagay, dapat mayroong hindi bababa sa isa mula sa isang "live" na bagay.
Gumagana ang mga tagakolekta ng basura sa konsepto ng GC Roots ( mga ugat ng pangongolekta ng basura ) upang makilala ang pagkakaiba sa pagitan ng mga buhay at patay na bagay. Mayroong 100% na mga live na bagay at mula sa kanila ay mayroong mga link na nagbibigay-buhay sa iba pang mga bagay at iba pa.
Mga halimbawa ng naturang mga ugat:
- Mga klase na ni-load ng system class loader.
- Mga live stream.
- Mga parameter ng kasalukuyang nagsasagawa ng mga pamamaraan at mga lokal na variable.
- Mga bagay na ginagamit bilang isang monitor para sa pag-synchronize.
- Mga bagay na pinapanatili mula sa koleksyon ng basura para sa ilang layunin.
- Ang kolektor ng basura ay naglalakad sa buong graph ng mga bagay sa memorya, simula sa mga ugat na ito at sumusunod sa mga sanggunian sa iba pang mga bagay.
Mga hakbang sa pangongolekta ng basura sa Java
Ang karaniwang pagpapatupad ng koleksyon ng basura ay may tatlong hakbang.
1. Markahan ang mga bagay bilang live
Sa puntong ito, dapat tukuyin ng garbage collector (GC) ang lahat ng buhay na bagay sa memorya sa pamamagitan ng pagtawid sa object graph.
Kapag binisita nito ang isang bagay, minarkahan ito bilang magagamit at samakatuwid ay buhay. Ang lahat ng bagay na hindi naa-access mula sa mga ugat ng GC ay itinuturing na mga kandidato para sa pangongolekta ng basura.
2. Paglilinis ng mga patay na bagay
Pagkatapos ng markup phase, ang memory space ay inookupahan ng alinman sa buhay (binisita) o patay (hindi binisita) na mga bagay. Ang yugto ng paglilinis ay nagpapalaya sa mga fragment ng memorya na naglalaman ng mga patay na bagay na ito.
3. Compact na pag-aayos ng mga natitirang bagay sa memorya
Hindi kinakailangang magkatabi ang mga patay na bagay na inalis sa nakaraang yugto. Kaya, nanganganib kang makakuha ng pira-piraso (kalahating walang laman) na espasyo sa memorya.
Ngunit, siyempre, na ibinigay para dito, posible na i-compact ang memorya sa sandaling ang kolektor ng basura ay nag-aalis ng mga patay na bagay. Ang natitira ay matatagpuan sa isang magkadikit na bloke sa simula ng heap.
Ang proseso ng compaction ay ginagawang mas madali ang sunud-sunod na paglalaan ng memorya para sa mga bagong bagay.
GO TO FULL VERSION