Each subclass of Allocator represents an allocation algorithm. The allocation algorithm is tightly coupled with the garbage collection algorithm. Each memory area is bound to a single allocation algorithm and no two instances of allocator objects will work in the same memory area. An `Allocator` can use multiple `MemoryArea`s (e.g. separate memory areas for different generations). The RawMemoryAccess provides a mechanism to read and write primitives directly into lower level memory. The allocator uses RawMemoryAccess to perform work.