http://en.wikipedia.org/wiki/Escape_analysis
Most short-lived objects can be stack allocated. Then the heap gets much less of a work out.
The runtime can figure out heap vs stack. Progressively better over time. Definitely better than I can do.
C# has (had?) the option of explicit stack allocated data (pseudo objects). Terrible idea. Premature optimization that prevents the runtime from doing a better job.
If I was doing embedded, realtime, or kernel dev work, I'd want to fiddle the bits myself. But I don't so I don't.