Reusing hot memory is a pretty ancient GC technique, though the details have varied over the decades.
You can Google "nursery generation" for some examples:
http://www.google.com/search?q=gc+nursery+generation
The original theory was that most objects in a functional language are extremely short-lived, and you want to reclaim them quickly. But if you GC your nursery generation after every few kB of allocations, you'll also keep the memory in L1 and L2 cache.
The ideal size of a nursery generation (and the value of reusing hot memory) should be measured empirically.
Of course, most popular scripting language GCs are non-copying, reference-counting collectors, which means they ignore techniques that were well-understood back in the 80s. However, this has not been a barrier to the adoption of Python, Ruby, etc., because the business value of high-performance code is often minimal.