Stalin also does global static life-time analysis for all allocated data. This allows much temporary allocated storage to be reclaimed without garbage collection.
Stalin does "whole program optimization". One of the results is that complete lifetimes of allocated objects very often are known ahead of time. Rather than force manual allocation, and rather than use a general garbage collector for all objects, Stalin can explicitly free objects at the point where it can prove the object is no longer referenced.
Because this is "whole program optimization" the software become inflexible to updates without re-analyzing the whole program. That's not too bad in many cases, especially considering the "whole program" may just be one or a set of components but not everything.
Stalin can also do interesting representation analyses, "unbox" values like numbers, and generally eliminate run-time type checking and dispatching. Perhaps the GNU Java Compiler can move toward these optimizations, and perhaps researchers will continue to look at ideas beyond the currently popular virtual machines; ideas that balance the need for dynamic programming and updates with transparent optimizations that get the most out of the hardware.