Точное поведение здесь полностью зависит от реализации JVM. В спецификации (это то, что требуется для правильной реализации JVM), это может происходить параллельно, это может произойти в первую очередь перед выполнением вашего кода или вообще не может произойти.
На практике мое наблюдение за JVM, которое я наблюдал, состояло в том, что оно сразу запускается в отдельном потоке. Однако в некоторых случаях множественные вызовы порождают несколько потоков, иногда он ставит запросы в очередь в одном потоке. Запущенная сборка мусора всегда была «остановкой мира» (то есть была очень полной и замедляла или приостанавливала работу приложения).
Однако, учитывая ваш комментарий к @Chris Dail, ваша основная проблема не в поведении вызова System.gc (). Вызов System.gc () может иметь несколько применений. Можно использовать чистую память, чтобы вы могли понять, насколько велика площадь приложения в настоящее время. Он также может быть использован в качестве стратегии для обеспечения того, чтобы сборщик мусора с остановкой происходил раньше, так что он «останавливает мир» на более короткий промежуток времени, поскольку для очистки требуется меньше памяти. (Должен отметить, что по мере того, как JVM становятся все более и более изощренными, подобные вещи становятся все менее и менее необходимыми и фактически становятся контрпродуктивными).
Однако то, что он не делает, в любом случае решает ошибку OutOfMemoryError. JVM не выдаст вам ошибку OutOfMemoryError, пока не соберет мусор в меру своих возможностей. Вызов System.gc не меняет этого. Если у вас есть OutOfMemoryError, это, вероятно, связано с тем, что вы держите ссылку на объекты способами, которые вам на самом деле не нужны, но препятствуют восстановлению памяти этих объектов.