Region-based memory management: Difference between revisions

Content deleted Content added
m Mention and cite Java21 arena support
Bender the Bot (talk | contribs)
 
(20 intermediate revisions by 8 users not shown)
Line 2:
{{Use American English|date = February 2019}}
 
In [[computer science]], '''region-based memory management''' is a type of [[memory management]] in which each allocated object is assigned to a '''region'''. A region, also called a '''partition''', '''subpool''', '''zone''', '''arena''', '''area''', or '''memory context''', is a collection of allocated objects that can be efficiently reallocated or deallocated all at once. Memory allocators using region-based managements are often called '''area allocators''', and when they work by only "bumping" a single pointer, as '''bump allocators'''.
 
Like [[stack allocation]], regions facilitate allocation and deallocation of memory with low overhead; but they are more flexible, allowing objects to live longer than the [[stack frame]] in which they were allocated. In typical implementations, all objects in a region are allocated in a single contiguous range of memory addresses, similarly to how stack frames are typically allocated.
 
In [[OS/360 and successors]], the concept applies at two levels; each job runs within a contiguous partition{{efn|For [[OS/360 and successors#MFT|MFT]] and [[OS/VS1]]}} or region.{{efn|For [[OS/360 and successors#MVT|MVT]], [[OS/VS2]] and later [[MVS]] systems.}} Storage allocation requests specify a subpool, and the application can free an entire subpool. Storage for a subpool is allocated from the region or partition in blocks that are a multiple of 2 KiB{{efn|For OS/360 and OS/VS1}} or 4 KiB{{efn|For OS/VS2 and later MVS systems.}} that generally are not contiguous.
== Example ==
As a simple example, consider the following [[C (programming language)|C]] code which allocates and then deallocates a [[linked list]] data structure:
 
<syntaxhighlight lang="c">
Region *r = createRegion();
ListNode *head = NULL;
for (int i = 1; i <= 1000; i++) {
ListNode* newNode = allocateFromRegion(r, sizeof(ListNode));
newNode->next = head;
head = newNode;
}
// ...
// (use list here)
// ...
destroyRegion(r);
</syntaxhighlight>
Although it required many operations to construct the linked list, it can be quickly deallocated in a single operation by destroying the region in which the nodes were allocated. There is no need to traverse the list.
 
== Implementation ==
Simple explicit regions are straightforward to implement; the following description is based on the work of Hanson.<ref name="hanson">
{{cite journal |last1=Hanson |first1=David R. |year=1989 |title=Fast allocation and deallocation of memory based on object lifetimes |journal=Software: Practice and Experience |volume=20 |issue=1 |pages=5–12 |url=http://www3.interscience.wiley.com/journal/113446436/abstract?CRETRY=1&SRETRY=0 |archive-url=https://archive.today/20121020025006/http://www3.interscience.wiley.com/journal/113446436/abstract?CRETRY=1&SRETRY=0 |url-status=dead |archive-date=2012-10-20 |doi=10.1002/spe.4380200104 |s2cid=8960945 |url-access=subscription }}
</ref> Each region is implemented as a [[linked list]] of large blocks of memory; each block should be large enough to serve many allocations. The current block maintains a pointer to the next free position in the block, and if the block is filled, a new one is allocated and added to the list. When the region is deallocated, the next-free-position pointer is reset to the beginning of the first block, and the list of blocks can be reused for the next allocated region. Alternatively, when a region is deallocated, its list of blocks can be appended to a global freelist from which other regions may later allocate new blocks. With either case of this simple scheme, it is not possible to deallocate individual objects in regions.
 
Line 81 ⟶ 65:
** An extension to C called RC<ref>{{cite web|url=http://berkeley.intel-research.net/dgay/rc/index.html |title=RC - Safe, region-based memory-management for C |last1=Gay |first1=David |year=1999 |work=David Gay's homepage |publisher=Intel Labs Berkeley |accessdate=22 February 2010 |url-status=dead |archive-url=https://web.archive.org/web/20090226070550/http://berkeley.intel-research.net/dgay/rc/index.html |archive-date=February 26, 2009 }}
</ref> was implemented that uses explicitly-managed regions, but also uses [[reference counting]] on regions to guarantee memory safety by ensuring that no region is freed prematurely.<ref>
{{cite conference |url=http://portal.acm.org/citation.cfm?id=277650.277748 |title=Memory management with explicit regions |last1=Gay |first1=David |author-link1=David Gay (mathematician) |last2=Aiken |first2=Alex |author-link2=Alex Aiken |year=1998 |book-title=PLDI '98: Proceedings of the ACM SIGPLAN 1998 conference on Programming language design and implementation |publisher=ACM |___location=New York, NY, USA |accessdate=22 February 2010 |pages=313&ndash;323 |isbn=0-89791-987-4 |doi=10.1145/277650.277748|url-access=subscription }}
</ref><ref>
{{Cite thesis |degree=PhD in Computer Science |title=Memory management with explicit regions |url=http://theory.stanford.edu/~aiken/publications/theses/gay.pdf |last=Gay |first=David Edward |year=2001 |publisher=University of California at Berkeley |accessdate=20 February 2010}}
Line 88 ⟶ 72:
</ref>
** A restriction of C called Control-C limits programs to use regions (and only a single region at a time), as part of its design to statically ensure memory safety.<ref>
{{cite conference |url=http://portal.acm.org/citation.cfm?id=581678 |title=Ensuring code safety without runtime checks for real-time control systems |last1=Kowshik |first1=Sumant |last2=Dhurjati |first2=Dinakar |last3=Adve |first3=Vikram |year=2002 |publisher=ACM |___location=New York, NY, USA |accessdate=22 February 2010 |book-title=CASES '02: Proceedings of the 2002 international conference on Compilers, architecture, and synthesis for embedded systems |pages=288&ndash;297 |isbn=1-58113-575-0 |doi=10.1145/581630.581678|url-access=subscription }}
</ref>
* Regions were implemented for a subset of [[Java (programming language)|Java]],<ref>
{{Cite thesis |degree=Masters in Computer ScienceFTP |title=Region-based memory management in Java |url=ftp://ftp.diku.dk/diku/semantics/papers/D-395.ps.gz |last=Christiansen |first=Morten V. |year=1998 |publisherserver=Department of Computer Science (DIKU), University of Copenhagen |url-status=dead |accessdate=20 February 2010 }}{{dead link|date=April 2018 |bot=InternetArchiveBot |fix-attempted=yes }}
</ref> and became a critical component of memory management in [[Real time Java]], which combines them with [[ownership type]]s to demonstrate object encapsulation and eliminate runtime checks on region deallocation.<ref>{{cite conference |url=http://www.cag.lcs.mit.edu/~rinard/paper/emsoft01.ps |title=An Implementation of Scoped Memory for Real-Time Java |last1=Beebee |first1=William S. |last2=Rinard |first2=Martin C. |year=2001 |publisher=Springer-Verlag |___location=London, UK |accessdate=22 February 2010 |book-title=EMSOFT '01: Proceedings of the First International Workshop on Embedded Software |pages=289&ndash;305 |isbn=3-540-42673-6 }}{{Dead link|date=February 2020 |bot=InternetArchiveBot |fix-attempted=yes }}</ref><ref>
{{cite tech report | title=A type system for safe region-based memory management in Real-Time Java | last1=Sălcianu |first1=Alexandru |author2=Chandrasekhar Boyapati, William Beebee, Jr., Martin Rinard |number=MIT-LCS-TR-869 | institution=MIT Laboratory for Computer Science |year=2003 |url=http://people.csail.mit.edu/rinard/techreport/MIT-LCS-TR-869.pdf}}
</ref><ref>
{{cite conference |url=http://portal.acm.org/citation.cfm?id=781168 |title=Ownership types for safe region-based memory management in real-time Java |last1=Boyapati |first1=Chandrasekhar |author-link1=Chandrasekhar Boyapati|last2=Salcianu |first2=Alexandru |author-link2=Alexandru Salcianu|last3=Beebee |first3=William Jr.|author-link3=William Beebee, Jr.|year=2003 |publisher=ACM |___location=New York, NY, USA |accessdate=22 February 2010 |book-title=PLDI '03: Proceedings of the ACM SIGPLAN 2003 conference on Programming language design and implementation |pages=324&ndash;337 |isbn=1-58113-662-5|doi=10.1145/781131.781168|url-access=subscription }}
</ref> More recently, a semi-automatic system was proposed for inferring regions in embedded real-time Java applications, combining a compile-time static analysis, a runtime region allocation policy, and programmer hints.<ref>
{{cite conference |url=http://hal.inria.fr/docs/00/30/96/88/PDF/06-Salagnac-ICOOOLPS.pdf |title=Efficient region-based memory management for resource-limited real-time embedded systems |last1=Nahkli |first1=Chaker |author-link1=Guillaume Salagnac |last2=Rippert |first2=Christophe |author-link2=Christophe Rippert |last3=Salagnac |first3=Guillaume |author-link3=Guillaume Salagnac |last4=Yovine |first4=Sergio |year=2007 |accessdate=22 February 2010 |book-title=Proceedings of "Workshop on Implementation, Compilation, Optimization of Object-Oriented Languages, Programs and Systems (ICOOOLPS'2006)"}}
Line 101 ⟶ 85:
{{cite conference |title=Semi-Automatic Region-Based Memory Management for Real-Time Java Embedded Systems |last1=Salagnac |first1=Guillaume |author-link1=Guillaume Salagnac|last2=Rippert |first2=Christophe |author-link2=Christophe Rippert|year=2007 |publisher=IEEE Computer Society |___location=Washington, DC, USA |book-title=RTCSA '07: Proceedings of the 13th IEEE International Conference on Embedded and Real-Time Computing Systems and Applications |pages=73&ndash;80 |isbn=978-0-7695-2975-2|doi=10.1109/RTCSA.2007.67}}
</ref> Regions are a good fit for [[real-time computing]] because their time overhead is statically predictable, without the complexity of incremental garbage collection.
* Java 21 added a Java API to allocate and release Arenas.<ref>{{cite web |title=Memory Segments and Arenas |url=https://docs.oracle.com/en/java/javase/21/core/memory-segments-and-arenas.html#GUID-01CE34E8-7BCB-4540-92C4-E127C1F62711 |publisher=Oracle}}</ref> The stated purpose of these is to improve safe integration with native libraries so as to prevent JVM memory leaks and to reduce the risk of JVM memory corruption by native code.<ref>{{cite web |last1=Cimadamore |first1=Maurizio |title=JEP 454: Foreign Function & Memory API |url=https://openjdk.org/jeps/454 |publisher=OpenJDK}}</ref> Arenas are a part of the Java Foreign Function and Memory Interface, which is a successor to [[Java Native Interface]] (JNI), and includes classes like <code>Arena</code>, <code>MemorySegment</code>, and others.<ref>{{cite web|title=Package java.lang.foreign|url=https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/lang/foreign/package-summary.html|publisher=Oracle Corporation}}</ref>
* Java 21 added a Java API to allocate and release Arenas.
<ref>{{cite web |title=Memory Segments and Arenas |url=https://docs.oracle.com/en/java/javase/21/core/memory-segments-and-arenas.html#GUID-01CE34E8-7BCB-4540-92C4-E127C1F62711 |publisher=Oracle}}</ref>. The stated purpose of these is to improve safe integration with native libraries so as to prevent JVM memory leaks and to reduce the risk of JVM memory corruption by native code.
<ref>{{cite web |last1=Cimadamore |first1=Maurizio |title=JEP 454: Foreign Function & Memory API |url=https://openjdk.org/jeps/454 |publisher=OpenJDK}}</ref>
* They were implemented for the [[logic programming]] languages [[Prolog]]<ref>
{{Cite thesis |degree=Masters in Computer Science |title=Region-based memory management in Prolog |url=http://www.diku.dk/OLD/publikationer/tekniske.rapporter/rapporter/00-09.pdf |last=Makholm |first=Henning |year=2000 |publisher=University of Copenhagen, Denmark |accessdate=20 February 2010 |url-status=dead |archive-url=https://web.archive.org/web/20110605004034/http://www.diku.dk/OLD/publikationer/tekniske.rapporter/rapporter/00-09.pdf |archive-date=5 June 2011 }}
Line 111 ⟶ 93:
{{cite book |last1=Phan |first1=Quan |author-link1=Quan Phan |last2=Janssens |first2=Gerda |title=Logic Programming |series=Lecture Notes in Computer Science |author-link2=Gerda Janssens |year=2007 |publisher=Springer Berlin / Heidelberg |volume=4670/2007 |pages=317&ndash;332 |issn=1611-3349 |doi=10.1007/978-3-540-74610-2 |isbn=978-3-540-74608-9 }}
</ref><ref>
{{cite conference |title=Runtime support for region-based memory management in Mercury |last1=Phan |first1=Quan |author-link1=Quan Phan |last2=Somogyi |first2=Zoltan |author-link2=Zoltan Somogyi |year=2008 |publisher=ACM |___location=New York, NY, USA |book-title=ISMM '08: Proceedings of the 7th international symposium on Memory management |pages=61&ndash;70 |isbn=978-1-60558-134-7|doi=10.1145/1375634.1375644 |url=http://dl.acm.org/citation.cfm?doid=1375634.1375644 |accessdate=15 April 2014|url-access=subscription }}
</ref> by extending Tofte and Talpin's region inference model to support backtracking and cuts.
* Region-based storage management is used throughout the [[parallel programming language]] [[ParaSail (programming language)|ParaSail]]. Due to the lack of explicit pointers in ParaSail,<ref>
{{Cite web |url=httphttps://parasail-programming-language.blogspot.com/2012/08/a-pointer-free-path-to-object-oriented.html|title=A Pointer-Free path to Object Oriented Parallel Programming |last1=Taft |first1=Tucker |year=2012 |work=ParaSail blog |accessdate=14 September 2012}}</ref> there is no need for reference counting.
 
== Disadvantages ==
Line 123 ⟶ 105:
== Hybrid methods ==
As mentioned above, RC uses a hybrid of regions and [[reference counting]], limiting the overhead of reference counting since references internal to regions don't require counts to be updated when they're modified. Similarly, some ''mark-region'' hybrid methods combine [[tracing garbage collection]] with regions; these function by dividing the heap into regions, performing a mark-sweep pass in which any regions containing live objects are marked, and then freeing any unmarked regions. These require continual defragmentation to remain effective.<ref>
{{cite conference |title=Immix: a mark-region garbage collector with space efficiency, fast collection, and mutator performance |last1=Blackburn |first1=Stephen M. |author-link1=Stephen M. Blackburn |last2=McKinley |first2=Kathryn S. |author-link2=Kathryn McKinley |year=2008 |publisher=ACM |___location=New York, NY, USA |book-title=PLDI '08: Proceedings of the 2008 ACM SIGPLAN conference on Programming language design and implementation |pages=22&ndash;32 |isbn=978-1-59593-860-2 |doi=10.1145/1375581.1375586 |url=http://dl.acm.org/citation.cfm?doid=1375581.1375586 |accessdate=15 April 2014|url-access=subscription }}
</ref>
 
== ExampleNotes ==
{{notelist}}
 
== References ==