In the Java runtime, if my application frees memory, does the runtime release the memory back to the OS? Or just back to my process?
That depends on the JVM implementation and isn't specified in the specification.
The Sun JVM will hold onto it as a first step. Once a certain (configurable) percentage of allocated memory is unused, it will return some of it to the OS (the behavior is influenced by the MinHeapFreeRatio and MaxHeapFreeRatio settings).