Paggawa gamit ang Generations of Objects

Ang Java garbage collectors ay nagpapatupad ng isang generational na diskarte sa pangongolekta ng basura na maaaring mag-uri-uriin ang mga bagay ayon sa edad.

Ang ganitong pangangailangan (upang markahan at i-compact ang lahat ng mga bagay) sa JVM ay maaaring tawaging hindi mahusay. Dahil habang ang isang malaking bilang ng mga bagay ay inilalaan, ang kanilang listahan ay lumalaki, na humahantong sa isang pagtaas sa oras ng koleksyon ng basura. Ang empirical analysis ng mga application ay nagpakita na ang karamihan sa mga object sa Java ay panandalian.

Ang heap memory area sa JVM ay nahahati sa tatlong seksyon:

Paggawa gamit ang Generations of Objects

Nakababatang henerasyon

Ang mga bagong likhang bagay ay nagsisimula sa nakababatang henerasyon. Ang nakababatang henerasyon ay nahahati pa sa dalawang kategorya.

  • Eden Space - Ang lahat ng mga bagong bagay ay nagsisimula dito, sila ay inilalaan ng paunang memorya.
  • Survivor Spaces (FromSpace at ToSpace) - Ang mga bagay ay inilipat dito mula sa Eden pagkatapos makaligtas sa isang cycle ng koleksyon ng basura.

Ang proseso kapag ang mga bagay ay basurang kinokolekta mula sa nakababatang henerasyon ay tinatawag na minor garbage collection event.

Kapag ang espasyo ng Eden ay napuno ng mga bagay, isang maliit na koleksyon ng basura ang isinasagawa. Ang lahat ng mga patay na bagay ay tinanggal, at ang lahat ng mga nabubuhay ay inilipat sa isa sa natitirang dalawang puwang. Sinusuri din ng maliit na GC ang mga bagay sa survivor space at inililipat ang mga ito sa isa pang (susunod) na survivor space.

Kunin natin ang sumusunod na pagkakasunod-sunod bilang isang halimbawa.

  1. May mga bagay ng parehong uri (buhay at patay) sa Eden.
  2. Ang isang maliit na GC ay nangyayari - lahat ng mga patay na bagay ay tinanggal mula sa Eden. Ang lahat ng buhay na bagay ay inilipat sa space-1 (Mula sa Space). Walang laman ang Eden at space-2.
  3. Ang mga bagong bagay ay nilikha at idinagdag sa Eden. Ang ilang mga bagay sa Eden at space-1 ay naging patay.
  4. Ang isang maliit na GC ay nangyayari - lahat ng mga patay na bagay ay tinanggal mula sa Eden at space-1. Ang lahat ng buhay na bagay ay inilipat sa space-2 (ToSpace). Walang laman ang Eden at space-1.

Kaya, anumang oras, ang isa sa mga survivor space ay palaging walang laman. Kapag naabot ng mga survivor ang isang partikular na threshold para sa paglipat sa mga survivor space, sumusulong sila sa isang mas lumang henerasyon.

Maaari mong gamitin ang -Xmn flag para itakda ang laki ng batang henerasyon .

Mas lumang henerasyon

Ang mga bagay na nabubuhay sa isang makabuluhang tagal ng oras (halimbawa, karamihan sa buong buhay ng isang programa) sa kalaunan ay nagiging mas lumang mga bagay - mga centenarian. Kilala rin ito bilang regular na henerasyon at naglalaman ng mga bagay na naiwan sa Survivor Spaces sa mahabang panahon.

Tinutukoy ng panghabambuhay na threshold ng isang bagay kung gaano karaming mga siklo ng pagkolekta ng basura ang dapat nitong pagdaanan bago ito ilipat sa mas lumang henerasyon. Ang proseso kapag ang mga bagay ay ipinadala sa basura mula sa mas lumang henerasyon ay tinatawag na pangunahing kaganapan sa koleksyon ng basura.

Maaari mong gamitin ang mga flag na -Xms at -Xmx upang itakda ang inisyal at maximum na laki ng memory ng heap .

Dahil gumagamit ang Java ng generational na pangongolekta ng basura, mas maraming kaganapan sa pangongolekta ng basura ang nararanasan ng isang bagay, lalo itong gumagalaw sa heap. Nagsisimula siya sa nakababatang henerasyon at kalaunan ay nagtatapos sa regular na henerasyon kung mabubuhay siya nang matagal.

Upang maunawaan ang pag-promote ng mga bagay sa pagitan ng mga espasyo at henerasyon, isaalang-alang ang sumusunod na halimbawa:

Kapag ang isang bagay ay nilikha, ito ay unang inilagay sa Eden space ng kabataang henerasyon.

Sa sandaling mangyari ang isang maliit na koleksyon ng basura, ang mga buhay na bagay mula sa Eden ay ililipat sa FromSpace. Kapag nangyari ang susunod na menor de edad na koleksyon ng basura, ang mga buhay na bagay mula sa Eden at espasyo ay inilipat sa ToSpace.

Ang cycle na ito ay nagpapatuloy sa isang tiyak na bilang ng beses. Kung ang bagay ay "nasa serbisyo" pa rin pagkatapos ng puntong ito, ililipat ito ng susunod na cycle ng koleksyon ng basura sa mas lumang espasyo ng henerasyon.

Permanenteng henerasyon at metaspace

Ang metadata tulad ng mga klase at pamamaraan ay iniimbak sa paulit-ulit na henerasyon. Pino-populate ito ng JVM sa runtime batay sa mga klase na ginagamit ng application. Ang mga klase na hindi na ginagamit ay maaaring pumunta mula sa permanenteng henerasyon hanggang sa basura.

Maaari mong gamitin ang -XX:PermGen at -XX:MaxPermGen na mga flag para itakda ang inisyal at maximum na laki ng permanenteng henerasyon .

meta space

Mula sa Java 8, ang PermGen space ay pinalitan ng MetaSpace memory space. Ang pagpapatupad ay naiiba sa PermGen - ang heap space na ito ay awtomatikong nababago.

Iniiwasan nito ang out-of-memory na problema ng application na nangyayari dahil sa limitadong laki ng heap space ng PermGen. Ang memorya ng metaspace ay maaaring makolekta ng basura, at ang mga klase na hindi na ginagamit ay awtomatikong malilinis kapag naabot ng metaspace ang maximum na laki nito.