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.