Operating systems have made tremendous progress since those days in terms of memory management. But surprisingly, applications haven’t. They still assume always-available needed memory supply; very rarely do they have any provisions to handle lack of memory. Modern Java applications use heap memory to manage it, but even that assumes that memory for the heap is available – otherwise an application would miserably fail. So the challenge to satisfy application memory needs is addressed by the infrastructure – standalone operating systems or hypervisors in a virtualized datacenter.