Я понял проблему. Как упомянул @Holger, оперативная память выделена для процесса Java, но не полностью заполнена кучей. Но причина , почему G1 выделяет так много оперативной памяти:
G1 страдает, если ему нужно выделить много огромных регионов. Они будут создаваться каждый раз, когда размер объекта> 50% от размера региона. Они будут тратить пространство, так как в регионе больше ничего не будет создано. Таким образом, если его размер составляет 51%, вы потеряете 49% территории региона. Хуже того, если область занимает 2 МБ, а ваш объект - 2,1 МБ, во втором регионе будет потрачено 1,9 МБ. Если вы выделяете большие объекты, настройте свой XX: G1HeapRegionSize.