Managementul memoriei pe regiune

Gestionarea memoriei bazată pe regiune  este o modalitate de gestionare a memoriei în care fiecare obiect creat în memorie este alocat unei „regiuni” specifice.

O regiune, numită și zonă, arenă [1] , regiune sau context de memorie, este un set de obiecte alocate care pot fi dealocate eficient în același timp. Similar cu gestionarea memoriei bazată pe stivă , gestionarea memoriei bazată pe regiune face alocarea și dealocarea memoriei mai ușoare, permițându-le să se realizeze cu o suprasolicitare minimă. Dar, în comparație cu stiva, gestionarea memoriei folosind regiuni poate fi mai flexibilă: acestea permit obiectelor să trăiască mai mult decât atunci când sunt plasate într-un cadru de stivă. În implementările tipice, toate obiectele din aceeași regiune sunt alocate în același interval contigu de adrese de memorie, similar modului în care sunt alocate de obicei cadrele de stivă.

Beneficii

În comparație cu alocarea memoriei bazată pe stivă, gestionarea memoriei bazată pe regiune permite o modalitate mai naturală de implementare a alocării memoriei în programarea paralelă. În plus, regiunile facilitează foarte mult lucrul cu virtualizarea și diverse tehnici de optimizare a performanței memoriei, simplificând sarcina de a muta simultan toate obiectele aparținând aceleiași regiuni în memorie cu acces mai rapid sau mai lent [2] .

Exemplu

Ca exemplu simplu, luați în considerare următorul cod C care alocă și apoi eliberează o structură de date, cum ar fi o listă legată :

Regiune * r = createRegion (); ListNode * head = NULL ; pentru ( int i = 1 ; i <= 1000 ; i ++ ) { ListNode * newNode = allocateFromRegion ( r , sizeof ( ListNode )); newNode -> next = head ; head = newNode ; } // ... // (utilizați lista aici) // ... destroyRegion ( r );

Deși lista legată a necesitat multe operațiuni pentru a crea, ea poate fi distrusă rapid într-o singură operațiune, eliberând zona în care au fost plasate elementele listei. Nu este nevoie să scanați lista și să ștergeți individual elementele acesteia.

Implementare

Regiunile simple explicite sunt ușor de implementat; următoarea descriere se bazează pe un articol al lui David Hanson [ 3 ] . Fiecare regiune este implementată ca o listă legată de blocuri mari de memorie; fiecare bloc trebuie să fie suficient de mare pentru a aloca memorie pentru multe obiecte din el. Structura de date din regiune conține un pointer către următoarea poziție liberă din bloc, iar dacă blocul este plin, sistemul de management al memoriei alocă un nou bloc și îl adaugă la listă. Când o regiune este eliberată, următorul indicator de poziție liberă este resetat la începutul primului bloc și întreaga listă de blocuri deja create poate fi reutilizată pentru a repoziționa obiectele din regiune. Într-o implementare alternativă, atunci când o regiune este eliberată, lista de blocuri alocate acesteia poate fi returnată la lista globală liberă, din care alte regiuni pot aloca ulterior blocuri noi. Cu toate acestea, într-o schemă atât de simplă, nu este posibilă eliberarea individuală a memoriei de anumite obiecte dintr-un bloc.

Supraîncărcarea per octet alocat este foarte mică pentru această schemă. Aproape toate episoadele de alocare a memoriei implică doar compararea și actualizarea indicatorului către următoarea poziție liberă. Singurele excepții sunt acele episoade când memoria din bloc se epuizează și managerul de memorie trebuie să atașeze un nou bloc regiunii. Eliberarea unei regiuni este o operațiune cu oră fixă ​​care este rar efectuată. Spre deosebire de sistemele obișnuite de colectare a gunoiului , gestionarea datelor bazată pe regiune nu trebuie să marcheze fiecare obiect de date cu tipul său .

Istorie și concepte

Însuși conceptul de regiuni este foarte vechi. A fost implementat pentru prima dată în 1967 în pachetul de stocare gratuit Douglas Ross AED , în care memoria era împărțită într-o ierarhie de zone. Pentru fiecare dintre zone, disciplina de gestionare a memoriei ar putea fi configurată individual. Fiecare dintre zone ar putea fi eliberată printr-o singură operațiune comună. Astfel, în acest pachet software, Ross a implementat pentru prima dată conceptul de management al memoriei bazat pe regiune practic [4] . În 1976 , tipul de date AREA a fost inclus în standardul de limbaj PL/I pentru managementul grupului al structurilor de date [5] . În 1990, Hanson a demonstrat că regiunile definite în mod explicit în C (pe care le-a numit arene) în managementul memoriei pot oferi performanță, măsurată ca timp petrecut pe octet alocat, care depășește chiar și cel mai rapid mecanism de alocare a heap -ului cunoscut [3] . Regiunile explicite au jucat un rol important în dezvoltarea unui număr de proiecte software timpurii bazate pe C, inclusiv Apache HTTP Server , unde sunt numite pool-uri, și PostgreSQL , unde sunt numite contexte de memorie [6] . La fel ca alocarea heap tradițională, aceste scheme nu asigură securitatea accesului la memorie ; un programator poate accesa o regiune de memorie după ce aceasta a fost eliberată printr-o legătură suspendată sau poate uita să elibereze regiunea, ceea ce duce la o scurgere de memorie .

Derivarea regiunilor

În 1988, oamenii de știință au început să exploreze modul de utilizare a regiunilor pentru alocarea sigură a memoriei, introducând conceptul de inferență regională . Ca parte a acestei tehnici, directivele pentru alocarea și eliberarea regiunilor, precum și obiectele individuale localizate în memorie care sunt legate static la o anumită regiune, sunt inserate în cod în etapa de compilare de către compilator. Compilatorul știe cum să facă acest lucru în așa fel încât să poată garanta absența indicatorilor suspendați și a pierderilor de memorie. În primele lucrări, Ruggieri și Murtagh au explorat o variantă a acestei tehnici în care o regiune este creată atunci când fiecare funcție este executată și eliberată când se termină [7] . În acest sens, au folosit analiza fluxului de date pentru a determina durata de viață pentru fiecare obiect de memorie alocat static și apoi a atribui acel obiect pentru alocare celei mai tinere regiuni până la momentul creării care conține obiecte cu acea durată de viață. În 1994, această lucrare a fost rezumată în lucrările originale ale lui Tofte și Talpin, care au extins tehnica propusă de Ruggieri și Murtagh pentru a sprijini polimorfismul de ordin superior al tipului și al funcției în limbajul de programare funcțional Standard ML . Lucrarea lui Tofte și Talpin a folosit un algoritm diferit bazat pe inferența de tip și pe conceptele teoretice ale tipurilor de regiuni și calculului regiunilor [8] [9] . Ei au propus o extindere a calculului lambda, inclusiv regiunile ca entitate specială. De fapt, au adăugat următoarele două constructe la calculul lambda:

e 1 la ρ: se calculează rezultatul expresiei e 1 și se stochează în regiunea ρ; letregion ρ in e2 end: creați o regiune și legați-o la ρ; calculați e 2 , apoi eliberați regiunea.

Din cauza acestei structuri sintactice, regiunile sunt „imbricate”, ceea ce înseamnă că dacă r 2 este creat după r 1 , trebuie eliberat și înainte de r 1 . Rezultatul este un „teanc” de regiuni. Mai mult, regiunile trebuie eliberate în aceeași funcție în care sunt create. Restricțiile au fost parțial relaxate de Aiken și colab. [10]

Acest calcul lambda extins a fost menit să servească drept o reprezentare intermediară sigură pentru memorie pentru compilarea programelor ML standard în codul mașinii. Cu toate acestea, crearea unui traducător care ar putea da rezultate bune pentru programe mari a întâmpinat o serie de limitări practice. Acestea trebuiau rezolvate folosind noi analize, inclusiv lucrul cu apeluri recursive, apeluri recursive de coadă și eliminarea regiunilor care conțineau o singură valoare din reprezentarea intermediară generată. Această lucrare a fost finalizată în 1995 [11] . Rezultatele sale au fost folosite de ML Kit, o versiune de ML a cărei manipulare a memoriei se baza pe regiuni, în loc de colectarea gunoiului. Apariția kit-ului ML a permis o comparație directă între cele două compilații de programe de testare de dimensiuni medii, care au dat rezultate foarte diferite („de 10 ori mai rapid și de patru ori mai lent”), în funcție de cât de „favorabil pentru regiune” un anumit program de testare a fost [ 12] . Kitul ML a fost în cele din urmă extins pentru aplicații mari. Au fost implementate două completări: compilarea separată a modulelor și o tehnică hibridă care combină deducerea limitelor regiunilor cu colectarea obișnuită a gunoiului. [13] [14]

Implementarea conceptului în alte limbaje de programare

După dezvoltarea kit-ului ML, regiunile au început să fie implementate pentru alte limbaje de programare:

  • În diferite extensii ale limbajului de programare C :
    • În dialectul securizat C , Cyclone , care a adăugat suport pentru regiuni explicite, printre multe alte caracteristici. Acest limbaj s-a concentrat în mare parte pe migrarea aplicațiilor existente în C și rafinarea lor pentru a utiliza regiuni [15] [16] [17] .
    • O extensie a lui C numită RC a implementat și regiuni explicite [18] . Dar acest limbaj folosește contorizarea referințelor specifice regiunii pentru a garanta și mai mult siguranța memoriei, asigurându-se că nicio regiune nu este eliberată prematur [19] [20] . Regiunile reduc suprasarcina de numărare a referințelor, deoarece referințele interne la regiuni nu necesită actualizarea contoarelor atunci când se modifică. RC include un sistem explicit de tip static pentru regiuni, care permite evitarea unor actualizări de refcount [21] .
    • Un subset de C numit Control-C necesită ca programele să folosească regiuni (și doar o regiune la un moment dat de execuție). Aceste restricții sunt considerate de autorii limbajului ca parte a proiectării sale pentru a oferi siguranță memoriei statice [22] .
  • Regiunile au fost implementate pentru un subset de Java [23] și au devenit o componentă critică a managementului memoriei în limbajul Realtime Java , care le combină cu tipuri de proprietate pentru a controla încapsularea obiectelor și pentru a elimina verificările la timpul rulării pentru a elibera o regiune [24] [25] [26] . Mai recent, a fost propus un sistem semi-automat pentru detectarea regiunilor în aplicații Java încorporate în timp real, care combină analiza statică în timp de compilare, politicile de alocare a regiunilor controlate în timpul execuției și sugestii de la programator la compilator [27] [28] Regiunile sunt potrivite pentru calcul în timp real , deoarece costul de timp pentru întreținerea lor este previzibil static și mult mai simplu decât colectoarele tradiționale de gunoi.
  • Au fost implementate regiuni pentru limbajele de programare logică Prolog [29] [30] și Mercury [31] [32] ; în aceste implementări, modelul de inferență regională al lui Tofte și Talpin a fost extins pentru declarații de backtracking și prolog cut .
  • Managementul memoriei bazat pe regiune este utilizat în limbajul de programare paralel ParaSail . Datorită absenței indicatoarelor explicite în ParaSail [33] , atunci când se implementează managementul memoriei, nu este nevoie de un mecanism suplimentar de numărare a referințelor în acesta.

Dezavantaje

Sistemele care utilizează regiuni pot întâmpina probleme în care regiunile devin foarte mari înainte de a fi eliberate și, prin urmare, conțin o proporție mare de date moarte. Astfel de regiuni sunt de obicei numite „scurgeri de memorie” (deși în cele din urmă sunt eliberate). Remedierea acestor scurgeri poate necesita restructurarea programului. De obicei, este produs prin adăugarea de noi regiuni cu o durată de viață mai scurtă. Depanarea acestui tip de probleme este deosebit de dificilă pe sistemele care utilizează inferența regiunii , unde programatorul trebuie să înțeleagă algoritmul de inferență care stă la baza sistemului sau să analizeze reprezentarea intermediară în detaliu pentru a diagnostica problema. Depanarea programelor folosind colectoarele de gunoi tradiționale este mult mai ușoară, iar eliberarea în timp util a memoriei care intră în scurgeri poate fi realizată fără a restructura programul, pur și simplu prin eliminarea erorilor logice în construcția acestuia. Aceste considerații au dat naștere unor sisteme hibride care combină gestionarea memoriei bazată pe regiune și colectarea convențională a gunoiului [13] . Pe de altă parte, la depanarea programelor cu colectarea gunoiului, pot apărea scurgeri și dacă sunt stocate referințe la date care nu vor mai fi folosite niciodată, iar această circumstanță trebuie monitorizată mult mai atent de către programator decât într-un sistem cu regiune. gestionarea memoriei.

Gestionarea memoriei bazată pe regiune funcționează cel mai bine atunci când numărul de regiuni este relativ mic și fiecare regiune conține multe obiecte. Programele care conțin multe regiuni rare vor suferi de fragmentare internă . Acest lucru, în cele din urmă, poate duce la pierderi de memorie și timp suplimentar petrecut pentru gestionarea regiunilor. Din nou, atunci când lucrați cu ieșirea regiunii, această problemă poate fi mai dificil de diagnosticat.

Tehnici hibride

După cum sa menționat mai sus, limbajul RC utilizează o tehnică hibridă de gestionare a memoriei care include regiuni și numărarea referințelor . Această abordare reduce suprasarcina de numărare a referințelor, deoarece legăturile dintre obiectele dintr-o regiune nu necesită actualizarea contoarelor atunci când sunt modificate, adăugate sau eliminate. În mod similar, unele metode hibride care utilizează etichetarea regiunilor combină urmărirea accesibilității obiectelor de colectare a gunoiului cu regiunile. Astfel de metode implică împărțirea heap -ului în regiuni, efectuarea unei treceri de urmărire care marchează orice regiuni care conțin obiecte active și apoi eliberarea oricăror regiuni neetichetate. Această abordare necesită o defragmentare constantă a memoriei pentru a fi eficientă [34] .

Note

  1. în sursele rusești acest termen aproape nu este folosit
  2. Acest lucru poate fi necesar, de exemplu, pentru a plasa toate obiectele legate de o anumită instanță a unei proceduri executate în paralel într-o secțiune de memorie aproape de un anumit procesor al unui sistem multiprocesor .
  3. 1 2 Hanson, David R. Fast allocation and deallocation of memory based on object lifetimes  //  Software: Practice and Experience : journal. - 1989. - Vol. 20 , nr. 1 . - P. 5-12 . - doi : 10.1002/spe.4380200104 . Arhivat din original pe 20 octombrie 2012.
  4. Ross, Douglas. Pachetul de stocare gratuită AED  (engleză)  // Comunicări ale ACM . - 1967. - Vol. 10 , nr. 8 . - P. 481-492 . - doi : 10.1145/363534.363546 .
  5. ^ American National Standards Institute, inc. Limbajul de programare standard național american PL/I  (engleză) . — 1976.
  6. 2010 PostgreSQL Global Development Group. Secțiunea 41.3: Gestionarea memoriei . Documentația PostgreSQL 8.2.15 (1996). Consultat la 22 februarie 2010. Arhivat din original pe 12 februarie 2010.
  7. Ruggieri, Cristina; Murtagh, Thomas P. (1988). „Analiza pe durata de viață a obiectelor alocate dinamic” . POPL '88: Actele celui de-al 15-lea simpozion ACM SIGPLAN-SIGACT privind Principiile limbajelor de programare . New York, NY, SUA: ACM. DOI : 10.1145/73560.73585 . Consultat la 22 februarie 2010 .
  8. Tofte, Mads; Jean-Pierre Talpin (1993). O teorie a alocării stivei în limbi tipate polimorf (raport tehnic). Departamentul de Informatică, Universitatea din Copenhaga. 93/15. Pe Citeseer Arhivat 21 iunie 2007.
  9. Tofte, Mads ; Talpin, Jean-Pierre (1994). „Implementarea calculului λ-apel după valoare tipizat folosind o stivă de regiuni” . POPL '94: Actele celui de-al 21-lea simpozion ACM SIGPLAN-SIGACT privind Principiile limbajelor de programare . New York, NY, SUA: ACM. pp. 188&ndash, 201. DOI : 10.1145/174675.177855 . ISBN  0-89791-636-0 . Arhivat din original pe 04.07.2014 . Consultat la 15 aprilie 2014 . Parametrul depreciat folosit |deadlink=( ajutor )
  10. Aiken, Alex; Manuel Fähndrich, Raph Levien (1995). Gestionare mai bună a memoriei statice: îmbunătățirea analizei bazate pe regiune a limbilor de ordin superior (raport tehnic). Departamentul EECS, Universitatea din California, Berkeley. UCB/CSD-95-866. Pe Citeseer Arhivat 21 iunie 2007.
  11. Birkedal, Lars ; Tofte, Mads ; Weilstrup, Magnus (1996). „De la inferența regiunii la mașinile von Neumann prin inferența de reprezentare a regiunii” . POPL '96: Actele celui de-al 23-lea simpozion ACM SIGPLAN-SIGACT privind Principiile limbajelor de programare . New York, NY, SUA: ACM. pp. 171&ndash, 183. DOI : 10.1145/237721.237771 . ISBN 0-89791-769-3 . Consultat la 22 februarie 2010 .  
  12. Tofte, Mads; Birkedal, Lars; Elsman, Martin; Hallenberg, Niels. O retrospectivă asupra managementului memoriei bazate pe regiune // Calcul simbolic de ordin superior. - 2004. - T. 17 , nr 3 . S. 245–265 . ISSN 1388-3690 . - doi : 10.1023/B:LISP.0000029446.78563.a4 .
  13. 1 2 Hallenberg, Niels; Elsman, Martin; Tofte, Mads. Combinând inferența regiunii și colectarea gunoiului // Notificări SIGPLAN. - 2003. - T. 37 , nr 5 . S. 141–152 . ISSN 0362-1340 . - doi : 10.1145/543552.512547 .
  14. Elsman, Martin. Siguranța colectării gunoiului pentru gestionarea memoriei bazată pe regiune  //  Notice SIGPLAN: jurnal. - 2003. - Vol. 38 , nr. 3 . P. 123–134 . ISSN 0362-1340 . - doi : 10.1145/640136.604190 .
  15. Ciclon: ​​Introducere în regiuni . Manual de utilizare Cyclone . Consultat la 22 februarie 2010. Arhivat din original pe 21 august 2010.
  16. Grossman, Dan; Morrisett, Greg; Jim, Trevor; Hicks, Michael; Wang, Yanling. Gestionarea memoriei bazată pe regiune în ciclon // SIGPLAN Notices. - 2002. - T. 37 , nr 5 . S. 282–293 . - doi : 10.1145/543552.512563 .
  17. Hicks, Michael; Morrisett, Greg ; Grossman, Dan (2004). „Experiență cu gestionarea manuală sigură a memoriei în ciclon” . ISMM '04: Actele celui de-al 4-lea simpozion internațional privind managementul memoriei . New York, NY, SUA: ACM. pp. 73&ndash, 84. DOI : 10.1145/1029873.1029883 . ISBN 1-58113-945-4 . Consultat la 22 februarie 2010 .  
  18. Gay, David RC - Management sigur, bazat pe regiune pentru memorie pentru C (downlink) . Pagina de pornire a lui David Gay . Intel Labs Berkeley (1999). Consultat la 22 februarie 2010. Arhivat din original pe 26 februarie 2009. 
  19. Gay, David ; Aiken, Alex (1998). „Gestionarea memoriei cu regiuni explicite” . PLDI '98: Actele conferinței ACM SIGPLAN 1998 privind proiectarea și implementarea limbajului de programare . New York, NY, SUA: ACM. pp. 313&ndash, 323. DOI : 10.1145/277650.277748 . ISBN 0-89791-987-4 . Consultat la 22 februarie 2010 .  
  20. Gay, David Edward (2001). Managementul memoriei cu regiuni explicite (PDF) (teză de doctorat în informatică). Universitatea din California din Berkeley. Arhivat (PDF) din original pe 07.09.2019 . Consultat la 20 februarie 2010 . Parametrul depreciat folosit |deadlink=( ajutor )
  21. Gay, David ; Aiken, AlexSuport lingvistic pentru regiuni // Notificări SIGPLAN. - 2001. - T. 36 , nr 5 . — S. 70–80 . — ISSN 0362-1340 . - doi : 10.1145/381694.378815 .
  22. Kowshik, Sumant; Dhurjati, Dinakar; Adve, Vikram (2002). „Asigurarea siguranței codului fără verificări de rulare pentru sistemele de control în timp real” . CAZURI '02: Actele conferinței internaționale din 2002 despre compilatoare, arhitectură și sinteză pentru sisteme embedded . New York, NY, SUA: ACM. pp. 288&ndash, 297. DOI : 10.1145/581630.581678 . ISBN 1-58113-575-0 . Consultat la 22 februarie 2010 .  
  23. Christiansen, Morten V. (1998). Managementul memoriei bazate pe regiuni în Java (teză de master în informatică). Departamentul de Informatică (DIKU), Universitatea din Copenhaga . Consultat la 20 februarie 2010 .  (link indisponibil)
  24. Beebee, William S.; Rinard, Martin C. (2001). „O implementare a memoriei definite pentru Java în timp real” . EMSOFT '01: Proceedings of the First International Workshop on Embedded Software . Londra, Marea Britanie: Springer-Verlag. pp. 289&ndash, 305. ISBN  3-540-42673-6 . Consultat la 22 februarie 2010 . (link indisponibil)
  25. Sălcianu, Alexandru; Chandrasekhar Boyapati, William Beebee, Jr., Martin Rinard (2003). Un sistem tip pentru gestionarea sigură a memoriei bazată pe regiune în Real-Time Java (PDF) (raport tehnic). Laboratorul MIT pentru Informatică. MIT-LCS-TR-869. Arhivat (PDF) din original pe 2021-09-28 . Consultat 2020-04-29 . Parametrul depreciat folosit |deadlink=( ajutor )
  26. Boyapati, Chandrasekhar ; Salcianu, Alexandru ; Beebee, Jr., William (2003). „Tipuri de proprietate pentru gestionarea sigură a memoriei bazată pe regiune în Java în timp real” . PLDI '03: Actele conferinței ACM SIGPLAN 2003 privind proiectarea și implementarea limbajului de programare . New York, NY, SUA: ACM. pp. 324&ndash, 337. DOI : 10.1145/781131.781168 . ISBN 1-58113-662-5 . Consultat la 22 februarie 2010 .  
  27. Nahkli, Chaker ; Rippert, Christophe ; Salagnac, Guillaume ; Yovine, Sergio (2007). „Gestionarea eficientă a memoriei bazată pe regiune pentru sisteme încorporate în timp real cu resurse limitate” (PDF) . Proceedings of "Workshop on Implementation, Compilation, Optimization of Object-Oriented Languages, Programs and Systems (ICOOOLPS'2006)" . Arhivat (PDF) din original pe 2012-02-26 . Consultat la 22 februarie 2010 . Parametrul depreciat folosit |deadlink=( ajutor )
  28. Salagnac, Guillaume ; Rippert, Christophe (2007). „Gestionarea memoriei semi-automatică bazată pe regiune pentru sistemele încorporate Java în timp real”. RTCSA '07: Proceedings of the 13th IEEE International Conference on Embedded and Real-Time Computing Systems and Applications . Washington, DC, SUA: IEEE Computer Society. pp. 73&ndash, 80. DOI : 10.1109/RTCSA.2007.67 . ISBN 978-0-7695-2975-2 .  
  29. Makholm, Henning (2000). Gestionarea memoriei bazată pe regiune în Prolog (PDF) (teză de master în informatică). Universitatea din Copenhaga, Danemarca. Arhivat din original (PDF) la 5 iunie 2011 . Consultat la 20 februarie 2010 .
  30. Makholm, Henning (2000). „Un manager de memorie bazat pe regiune pentru prolog” . ISMM '00: Proceedings of the 2nd international simpozion on Memory management . New York, NY, SUA: ACM. pp. 25&ndash, 34. DOI : 10.1145/362422.362434 . ISBN 1-58113-263-8 . Consultat la 22 februarie 2010 .  
  31. Phan, Quan ; Janssens, GerdaAnaliza regiunii statice pentru Mercur. - Springer Berlin / Heidelberg, 2007. - T. 4670/2007. — S. 317–332. — (Note de curs în Informatică). - ISBN 978-3-540-74608-9 . - doi : 10.1007/978-3-540-74610-2 .
  32. Phan, Quan ; Somogyi, Zoltan (2008). „Suport de execuție pentru gestionarea memoriei bazată pe regiune în Mercury” . ISMM '08: Actele celui de-al 7-lea simpozion internațional privind managementul memoriei . New York, NY, SUA: ACM. pp. 61&ndash, 70. DOI : 10.1145/1375634.1375644 . ISBN  978-1-60558-134-7 . Arhivat din original pe 01.06.2018 . Consultat la 15 aprilie 2014 . Parametrul depreciat folosit |deadlink=( ajutor )
  33. Taft, Tucker O cale fără pointer către programarea paralelă orientată pe obiecte . Blog ParaSail (2012). Preluat la 14 septembrie 2012. Arhivat din original la 13 august 2012.
  34. Blackburn, Stephen M .; McKinley, Kathryn S. (2008). „Immix: un colector de gunoi din regiune marcată cu eficiență în spațiu, colectare rapidă și performanță mutator” . PLDI '08: Actele conferinței ACM SIGPLAN din 2008 privind proiectarea și implementarea limbajului de programare . New York, NY, SUA: ACM. pp. 22&ndash, 32. DOI : 10.1145/1375581.1375586 . ISBN  978-1-59593-860-2 . Arhivat din original pe 19.11.2018 . Consultat la 15 aprilie 2014 . Parametrul depreciat folosit |deadlink=( ajutor )