Linya ng pag-uugali ng kolektor ng basura (memory reclaimer)
Ang Java programmer ay hindi kailangang subaybayan ang paglalaan ng memorya dahil ang tagakolekta ng basura ay awtomatikong namamahala ng memorya. Ang Garbage Collector ay pinapatakbo ng Java Virtual Machine (JVM). Ang garbage collector ay isang mababang priyoridad na proseso na pana-panahong tumatakbo at nagpapalaya ng memorya na ginagamit ng mga bagay na hindi na kailangan. Ang iba't ibang JVM ay may iba't ibang algorithm sa pagkolekta ng basura. Mayroong ilang mga algorithm na ginamit, halimbawa: reference counting algorithm o markup at scraping algorithm.
Pagpapatakbo ng tagakolekta ng basura sa Java
Karaniwang pinapatakbo ng JVM ang kolektor ng basura kapag mababa ang libreng memorya. Ngunit ang operasyon ng kolektor ng basura ay hindi ginagarantiyahan na palaging may sapat na libreng memorya. Kung walang sapat na memorya kahit na pagkatapos ng pagbawi, ang JVM ay magtapon ng OutOfMemoryError exception. Pakitandaan na dapat patakbuhin ng JVM ang kolektor ng basura kahit isang beses bago magtapon ng exception. Maaari mong hilingin sa tagakolekta ng basura na tumakbo sa Java, ngunit hindi mo mapipilit ang pagkilos na ito.
Kahilingan na patakbuhin ang tagakolekta ng basura
Para humiling, maaari kang tumawag sa isa sa mga sumusunod na paraan:
System.gc()
Runtime.getRuntime().gc()
Angkop na patakbuhin ang kolektor ng basura
Ang isang bagay ay dapat itapon kapag ito ay hindi na magagamit sa buhay na batis. Ang isang bagay ay maaaring isailalim sa pagtatapon sa iba't ibang mga kaso:
- Kung ang isang variable ng isang uri ng sanggunian na tumutukoy sa isang bagay ay nakatakda sa "0", ang bagay ay dapat na itapon kung walang iba pang mga sanggunian dito.
- Kung ang isang variable ng isang uri ng sanggunian na tumutukoy sa isang bagay ay ginawa upang sumangguni sa isa pang bagay, ang bagay ay dapat na itapon kung walang iba pang mga sanggunian dito.
- Ang mga bagay na nilikha nang lokal sa isang pamamaraan ay itatapon kapag lumabas ang pamamaraan, maliban kung na-export ang mga ito mula sa pamamaraang iyon (iyon ay, ibinalik o itinapon bilang isang pagbubukod).
- Maaaring itapon ang mga bagay na tumutukoy sa isa't isa kung wala sa kanila ang available sa live na thread.
Tingnan natin ang isang halimbawa:
public class TestGC
{
public static void main(String [] args)
{
Object o1 = new Integer(3);
Object o2 = new String("Tutorial");
o1 = o2;
o2 = null;
}
}
Sa halimbawang ito
Integer
, ang object (integer) na orihinal na tinukoy ng o1 ay maaaring itapon pagkatapos ng linya 3 dahil ang o1 ay tumutukoy na ngayon sa object
String
(string). Kahit na ang o2 ay nilikha upang tumukoy sa null, ang bagay
String
(string) ay hindi nare-recycle dahil ang o1 ay tumutukoy dito.
Pagtatapos
Binibigyang-daan ka ng teknolohiya ng Java na gumamit ng isang paraan
finalize()
(i-finalize) upang gawin ang kinakailangang paglilinis bago makuha ng kolektor ng basura ang isang bagay mula sa memorya. Ang pamamaraang ito ay tinatawag sa isang bagay ng kolektor ng basura kapag natukoy ng tagakolekta ng basura na wala nang mga sanggunian sa bagay. Inilalarawan ito sa klase
Object
, na nangangahulugang minana ito ng lahat ng klase. Ino-override ng subclass ang pamamaraan
finalize()
upang palayain ang sarili nito mula sa mga mapagkukunan ng system o para sa isa pang paglilinis:
protected void finalize() throws Throwable
Kung ang isang hindi rehistradong pagbubukod ay itinapon ng method
finalize()
, ang pagbubukod ay hindi papansinin at ang pagwawakas ng bagay na iyon ay hihinto.
finalize()
Isang beses lang i-invoke ang method sa buong buhay ng object. Posibleng gumamit ng paraan
finalize()
sa anumang bagay upang maprotektahan ito mula sa pagtatapon. Ngunit sa kasong ito, ang kolektor ng basura ay hindi na aktibo
finalize()
para sa bagay na ito. Ang pamamaraan
finalize()
ay palaging gagamitin nang isang beses bago ang bagay ay makolekta ang basura. Gayunpaman, posible na ang pamamaraan
finalize()
ay hindi isaaktibo para sa isang naibigay na bagay sa buong tagal ng pagkakaroon nito, dahil maaaring hindi ito napapailalim sa pagtatapon.
Buod
Sa seksyong ito, tiningnan namin ang proseso ng pagkolekta ng basura, na isang diskarte sa pamamahala ng memorya sa wikang Java. Hindi maaaring pilitin ang pagkolekta ng basura. Nalaman namin ang tungkol sa iba't ibang paraan upang gawing karapat-dapat ang mga bagay para sa pag-recycle at nalaman namin na ang pamamaraan
finalize()
ay ginagamit bago ang bagay ay i-reclaim ng basurero.
Mag-ehersisyo
Tanong: Ilang bagay ang sasailalim sa pagtatapon pagkatapos ng linya 7?
public class TutorialGC
{
public static void main(String [] args)
{
Object a = new Integer(100);
Object b = new Long(100);
Object c = new String("100");
a = null;
a = c;
c = b;
b = a;
}
}
Mga pagpipilian sa sagot: A. 0 B. 1 C. 2 D. 3 E. Hindi maaaring isama ang code
Tamang opsyon: B
Paliwanag: Sa tatlong bagay na nilikha sa linya 1, 2 at 3, ang bagay lamang
Integer
ang dapat itapon sa dulo ng linya 7. Ang mga variable na sanggunian, a, na orihinal na tumutukoy sa bagay
Integer
, ay tumutukoy sa bagay
String
sa linya 5. Kaya,
Integer
ang bagay ay dapat na itapon pagkatapos ng linya 5, dahil walang mga variable na tumutukoy dito. Mga variable
b
at
c
sumangguni sa mga bagay
String
at
Long
bagay sa mga linya 6 at 7, kaya hindi sila nare-recycle.
GO TO FULL VERSION