Я нашел эту очень интересную статью о том, как Java 9 планировала собирать мусор по-разному.
В частности, Java 9 планирует использовать сборщик мусора G1, который делит память на фиксированные размеры. То, что может делать ваш код, - это запускать разделение памяти на два блока фиксированного размера для Java 9. Причина этого заключается в том, что он сэкономит другую половину памяти для перемещения всего и «сжатия» памяти, которая все еще используется. Тем не менее, поскольку вы просто продолжаете использовать память, она сразу же сломается, когда ~ 1/2 памяти будет использована. Я не уверен, насколько строгой может быть ваша CS, но в моей школе мы изучали простые методы сбора мусора, и одна из таких простых, о которых G1GC напоминает мне, - это метод stop-and-copy , который переключает выделенная память между половинами памяти, в то время как она «сжимает» память при этом.
В Java 8 используется Parallel Collector, который отличается от G1GC, так как все, что ему нужно, - это пропускная способность. Таким образом, будет использовано ближе к 100% истинной кучи за счет увеличения времени GC. Конечно, это компромисс между двумя версиями, но вы можете обойти это, явно указав тип GC для использования. Например, если в Java 9 вы используете опцию:
-XX:UseParallelGC
вы должны увидеть то же поведение, что и в Java 8. В статье, на которую я ссылаюсь, есть все разные варианты, но я думаю, вы поняли идею. Надеюсь, что это поможет / ответит на ваш вопрос, я на самом деле не осознавал этого, пока вы не подняли его, поэтому спасибо, что сообщили мне об этом.
РЕДАКТИРОВАТЬ: Согласно самим Oracle , они говорят, что новый сборщик мусора G1 предназначен для машин с большим объемом памяти, опять же объясняя причину, почему они не будут использовать пространство полной кучи для тратить меньше времени на GC-ing.