Ваша проблема не в GC, а в механике JVM Stop-The-World - safepoints . JVM ждет, пока все потоки не будут запаркованы в безопасной точке, прежде чем начинать работу, связанную с GC.
Если ваш Java-код использует файлы с отображением в памяти, вам, возможно, придется заменить его на обычный ввод-вывод. Отображение памяти (особенно тяжелая запись) плохо работает с механикой безопасных точек. Операционная система, ожидающая записи / чтения страницы памяти, может заблокировать поток, обращающийся к отображенному в памяти файлу. Если GC запускается в такой момент, ему придется ждать возобновления заблокированного потока ввода-вывода и достижения следующей проверки безопасной точки.
ОБНОВЛЕНИЕ: Поместить просто, если поток Java заблокирован при RandomFile
/ Channel
методе чтения, это не мешает безопасной точке JVM. Но если поток Java заблокирован при операции чтения / записи в файле с отображенной памятью, JVM не может войти в безопасную точку, пока поток не будет разблокирован. Если такой доступ заключен в цикл, он может даже ожидать завершения цикла при определенных условиях.
Еще одна проблема, вызывающая длительное "Остановка потоков, занимаемых" - это циклы. Если у вас есть простой цикл с int counter, JVM считает его «быстрым» и может пропустить проверку безопасной точки в теле цикла.