"precise garbage collection" is a contradiction in terms, at least when applied to Java-style GC.
C++'s garbage collection is *precise* -- objects are destroyed when they go out of scope. In Java, you never know when you're going to get your memory back.