As the Java Language Specification states
The scope of a declaration is the region of the program within which
the entity declared by the declaration can be referred to using a
simple name, provided it is visible (§6.4.1).
In other words, scope only regulates the use of names within source code. It has no effect on runtime behavior, and therefore has no effect on garbage collection.
Your first suggestion is more or less the only reason to use a block. But some times it gets too cumbersome. Personally, I've maybe used them once or twice in code I've written.
Garbage collection is partly defined by finalization of class instances. That chapter speaks about reachability
A reachable
object is any object that can be accessed in any potential
continuing computation from any live thread.
The JVM cannot collect such objects.
The JLS also mentions
Optimizing transformations of a program can be designed that reduce
the number of objects that are reachable to be less than those which
would naively be considered reachable. For example, a Java compiler or
code generator may choose to set a variable or parameter that will no
longer be used to null to cause the storage for such an object to be
potentially reclaimable sooner.
This is also discussed in the answer to