Java-> System.gc (); этот вызов открывает новый поток или нет?

Например, я такой код

... получите некоторую память и потеряйте все указатели на ту память так, чтобы System.gc (); может собрать его.

назовите System.gc ();

сделайте некоторые другие задачи;


Здесь делает, "делают некоторые другие задачи"; и "System.gc ()"; работы в параллели или делают, "делают некоторые другие задачи"; ожидает "System.gc ()"; выполняться

Спасибо

5
задан ogzylz 19 April 2010 в 12:19
поделиться

9 ответов

Точное поведение здесь полностью зависит от реализации JVM. В спецификации (это то, что должна предоставить вам правильная реализация JVM), это может происходить параллельно, это может происходить до того, как ваш код будет выполнен, или это может не произойти вообще.

На практике я заметил, что JVM запускается сразу в отдельном потоке. Однако в некоторых случаях несколько вызовов порождают несколько потоков, иногда запросы ставятся в очередь в одном потоке. Запущенная сборка мусора всегда была типом «останови мир» (то есть она была очень полной и замедляла или приостанавливала работу приложения).

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

Однако он никоим образом не решает OutOfMemoryError. JVM не выдаст вам OutOfMemoryError, пока не соберет мусор в меру своих возможностей. Вызов System.gc этого не меняет.Если у вас есть OutOfMemoryError, это, вероятно, связано с тем, что вы держите ссылку на объекты способами, которые вам действительно не нужны, но которые препятствуют освобождению памяти этих объектов.

6
ответ дан 18 December 2019 в 08:27
поделиться

Как указал Эрик Эйкеленбум , вызов этого метода не означает, что сборщик мусора будет выполняться немедленно. На самом деле вы не знаете, будет ли он вообще вызван ...

В вашем случае (судя по комментарию к ответу Amarghosh ) вам нужно освободить некоторую память, прежде чем что-то делать это требует много оперативной памяти, я прав? В этом случае вам не о чем беспокоиться. Если памяти достаточно для сборки мусора, это будет сделано автоматически, когда вы попытаетесь ее выделить.

1
ответ дан 18 December 2019 в 08:27
поделиться

javadoc сообщает http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#gc () : " Когда управление возвращается из вызова метода, виртуальная машина Java сделала все возможное, чтобы освободить пространство для всех отброшенных объектов. «

Так что я бы сказал, что« выполните некоторые другие задачи »; ждет "System.gc ();" быть выполненным!

Параллелизм не используется - и это плохо для Java-приложения. Фактически, никогда не стоит вызывать / принудительно вызывать сборщик мусора. Это должно быть зарезервировано на крайние случаи без других решений ...

Пока, Албан.

0
ответ дан 18 December 2019 в 08:27
поделиться

Как выполняется сборка мусора, зависит от реализации JVM. Обычные реализации могут останавливать все потоки для глобального сбора памяти, останавливать только один поток, например, для сбора локальной памяти для этого потока. Подробнее о сборке мусора можно прочитать в Sun и в этой более старой, но хорошей статье .

1
ответ дан 18 December 2019 в 08:27
поделиться

Нет способа узнать. Вызов System.gc () не означает, что сборка мусора выполняется в эту самую секунду, это просто запланировано. JVM должна выполнить сборку мусора в подходящее время.

0
ответ дан 18 December 2019 в 08:27
поделиться

«Выполнить другую задачу» ожидает выполнения и возврата System.gc () .

0
ответ дан 18 December 2019 в 08:27
поделиться

Согласно спецификации Java, поток, который вызывает System.gc () , останавливается до тех пор, пока сборщик мусора не выполнит свое поступок. Обратите внимание, что это всего лишь подсказка, JVM может ее игнорировать, а JVM Sun на самом деле имеет переключатель командной строки ( -XX: -DisableExplicitGC ) для этого. С этим переключателем System.gc () ничего не делает и немедленно возвращается.

В любом случае ничто в спецификации не препятствует запуску других потоков. Это зависит от алгоритма GC; JVM Sun включает в себя несколько, некоторые из которых могут работать одновременно с прикладными потоками для большей части своей работы.

Как было указано другими, чистый эффект явного вызова System.gc () в большинстве случаев приводит к снижению производительности. Если вы чувствуете, что должны вызвать этот метод, скорее всего, вы делаете что-то не так.

0
ответ дан 18 December 2019 в 08:27
поделиться

Вам, вероятно, не следует использовать System.gc (). Распространенное заблуждение пользователей C / C ++, переходящих на java, заключается в том, что они думают, что им нужно сообщить виртуальной машине, когда она может выполнять сборку мусора. Реальность такова, что сборщик мусора сильно оптимизирован и выполняет эту задачу самостоятельно, когда считает, что это лучше всего. Вызов System.gc () обычно не рекомендуется.

Если вы вызовете System.gc (), он «порекомендует» системе выполнить сборку мусора. На самом деле он может не выполнять сбор, хотя обычно это происходит. Если он выполняется в другом потоке, это зависит от фактического алгоритма сбора. По умолчанию все будет заблокировано во время работы. Таким образом, он может работать в отдельных потоках, но при этом блокирует ваше текущее выполнение.

7
ответ дан 18 December 2019 в 08:27
поделиться

Обычно это синхронно, но не гарантируется.

На самом деле не гарантируется, что сборка будет происходить эффективно, поскольку JVM решит, имеет ли это смысл и какой вид сборки мусора использовать.

Если вам нужна дополнительная информация, вы можете запустить свою программу с помощью флага -verbosegc ..

В любом случае сборка мусора выполняется автоматически JVM без каких-либо определенных вызовов, вызывая System.gc () - это просто подсказка, которую вы даете, чтобы сообщить ему, что он может начать сбор.

4
ответ дан 18 December 2019 в 08:27
поделиться