JVM_FreeMemory() has two problems:
1) It currently uses Heap_lock to protect capacity() and used() from changing while calculating the amount of free memory available. However, Heap_lock is doesn't protect capacity() and used() in all collectors, and as a result, JVM_FreeMemory() could return a negative value.
2) The amount of free memory is not always calculated using capacity() - used(). For ZGC, we also want to take the reserve into account.
The proposed solution is to introduce CollectedHeap::unused() (the name is chosen to match CollectedHeap::used()), so that we can delegate this calculation to the GC.
1) It currently uses Heap_lock to protect capacity() and used() from changing while calculating the amount of free memory available. However, Heap_lock is doesn't protect capacity() and used() in all collectors, and as a result, JVM_FreeMemory() could return a negative value.
2) The amount of free memory is not always calculated using capacity() - used(). For ZGC, we also want to take the reserve into account.
The proposed solution is to introduce CollectedHeap::unused() (the name is chosen to match CollectedHeap::used()), so that we can delegate this calculation to the GC.