Единственный случай, который я могу вспомнить, где это может произойти, как вы описываете, это если вы используете WeakReference s (или истек срок действия SoftReference s, которые в целом похожи в это ситуация) для ссылки на объекты, которые вы все еще хотите сохранить. Объекты, которые могут попасть в состояние, в котором они собирают в состоянии GC; но пока он действительно не запустится, вы все равно сможете связаться с ними по ссылкам. Вызов System.gc()
, даже если у него нет гарантированной семантики, может привести к тому, что сборщик запустится и соберет все эти слабо достижимые объекты.
Это кажется маловероятным, потому что
- Случайное использование WeakReferences для сильно достижимых объектов не кажется легкой ошибкой. Даже если вы пользуетесь библиотеками, мне трудно вспомнить случай, когда вы могли бы в итоге по ошибке использовать слабые ссылки.
- Если это произойдет, поведение приложения в любом случае будет неопределенным. Сборка мусора может произойти в любое время, поэтому вы, вероятно, увидите несогласованное поведение без вызова System.gc (). В любом случае у вас всегда будет какой-то фрагмент кода, который выполняется сразу после коллекции, и вы не сможете найти его референтный объект.
- System.gc () теоретически ничего не делает, поэтому не должно вызывать это.
Этот последний пункт важен - почему вы все равно вызываете System.gc () , когда это почти всегда контрпродуктивно для вызова? Я не верю, что у вас есть законная необходимость называть это, она не делает ничего, на что вы можете положиться, и, очевидно, она нарушает ваше приложение.
Так что, если ваше приложение работает нормально без вызова, просто прекратите его делать.
Я все же рассмотрел бы вопрос о том, как совместимо ваше приложение, потому что это не будет реальной причиной проблемы, и у вас, вероятно, есть более глубокая проблема, которая очень хрупкая и просто ждет, чтобы ее потом решить.
РЕДАКТИРОВАТЬ: Другой возможной причиной этого может быть простое время. Звонок System.gc()
, вероятно, займет немалое количество времени. В течение этого периода другие потоки могут прогрессировать и изменять состояние так, как этого не ожидает поток GCing. Следовательно, когда он возвращается из вызова, состояние мира нарушает его ожидания и, следовательно, возникают логические ошибки. Опять же, это всего лишь предположение, но оно более правдоподобно, чем WeakReference.