Abstractions on abstractions on abstractions; background tasks and their abstraction stacks; increased cache and buffer sizes to take advantage of increased typical memory capacity. For an example of the latter, handling TCP on a Commodore 64 is a problem because the memory can only fit about 45 packets with nothing left over, but now you can just allocate a megabyte receive buffer per connection.
Neither do the developers, because until recently, RAM was so cheap it didn’t matter, and we were in a situation where almost no one ever needed to consider “how much RAM will this take?” when writing code.
Like Homer Simpson said about alcohol: "To alcohol! The cause of, and solution to, all of life's problems", we developers can say about AI (assuming AI-assisted coding can save memory in popular programs, OSes, etc)