Здесь есть несколько вещей, на которые стоит обратить внимание.
Во-первых, то, как вы описываете свое приложение, выглядит классической утечкой памяти (даже если это преднамеренно).Если у вас есть поток, который продолжает выделять объекты, на которые он ссылается, в конечном итоге вам не хватит места в куче.Глядя на журнал GC и график кучи, это именно то, что происходит.Полные ГХ работают постоянно, чтобы попытаться освободить место для работы вашего приложения.Сборщик не освобождает места, что удивляет меня тем, что виртуальная машина не останавливается с ошибкой OutOfMemoryError.OutOfMemoryError будет иметь место, если куча постоянно заполнена на 98% или более и GC не может освободить более 2% пространства.Журнал GC показывает, что это правда.
Следующий вопрос - почему пространство кучи не расширяется выше 8 Гб.Вы устанавливаете опцию -Xmx на 10 Гб, так что логично ожидать, что куча вырастет до этого размера, если потребуется.На 16-гигабайтной машине нет причин, чтобы этого не произошло.Я бы добавил опцию -Xms, чтобы также установить начальный размер 10 Гб, что заставит JVM зарезервировать все это пространство при запуске.
Как было указано в комментариях, вы должны профилировать свое приложение.чтобы лучше понять, на какие объекты вы ссылаетесь, и если есть какой-то способ, вы можете уменьшить это.С неограниченным набором данных вы всегда достигнете точки, в которой приложение не сможет продолжить работу.