Abstraction and several implementations of a memory manager; useful for I/O
processing when direct buffer management is required. For instance, using
allocators it is possible to control maximum memory usage by I/O buffers
and to perform blocking allocation instead of throwing OutOfMemoryError.
Example application is in {@link edu.emory.mathcs.util.io.BufferedPipe},
where it is possible to set
limits on memory usage of the in-proc pipes.