All method parameters go on the stack. All local variables go on the stack. The only thing that goes in the heap is stuff allocated explicitly using new
(or implicitly by auto-boxing or varargs.)
Another way to think about it is that primitive values and object/array references may go on the stack, but actual objects cannot1.
So:
1) - you are returning a primitive value (not a variable!), and it goes on the stack. (You can't "return" a variable. The variable is part of the stack frame and can't be detached from it.)
2) Yes.
3) Yes, at least for now1. At some point, the GC may run, notice that the application doesn't have a reference to the object any more, and reclaim it.
1 - actually, the latest Hotspot compilers are capable of detecting that an object's reference never "escapes" from the method that creates it, and that the objects could be allocated on the stack. IIRC, this optimization - called escape analysis - needs to be enabled using a JVM command-line flag.