Each programming language imposes specific restrictions on storage management. Design principles of a programming language with respect to storage management come from the assumed purposes and expected performance of the language. Time-critical applications may not allow garbage collections. Robustness may be more important than performance. Productivity of software may be one of the crucial factors in design.
One of the inescapable obstacles to storage management is how to bridge the gaps between volatile main storage and persistent secondary storage especially in combination with dynamic allocation of objects. As discussed above, dynamic objects are manipulated via pointers or references, which results in graph structures. Applications usually vary in persistent representation of graph objects in a flat stream. Performance, interface, and flexibility change drastically with implementations.