Когда делает System.gc (), делают что-то?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

112
задан Michael 29 May 2019 в 10:07
поделиться

10 ответов

Вы видите System.gc () вызовы, которые будут сделаны из многочисленных источников и не только из Вашего исходного кода приложения. Таким образом ища Ваш код приложения ‘System.gc () ’ представляют isn’t в виде строки достаточно, чтобы сказать, делает ли Ваше приложение System.gc () вызовами. Таким образом это ставит проблему: Как обнаружить, вызываются ли System.gc () вызовы в Вашей стопке целого приложения?

Это - то, куда журналы GC прибывают удобные. Включите GC, входит в систему Ваше приложение. На самом деле, it’s желательный для хранения журнала GC включил все время во всех рабочих серверах, поскольку он помогает Вам диагностировать и оптимизировать производительность приложения. Включение журналов GC добавляет незначительный (если вообще заметный) наверху. Теперь загрузите свой журнал GC на инструмент анализатора журнала Сборки "мусора" как GCeasy, HP JMeter, †¦. Эти инструменты генерируют богатый аналитический отчет о Сборке "мусора".

Читать дальше Оборотные стороны вызова System.gc ()

0
ответ дан 4 November 2019 в 23:51
поделиться

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

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

58
ответ дан jodonnell 24 November 2019 в 02:52
поделиться

Я не могу думать об определенном примере, когда хорошо выполнить явный GC.

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

, Кроме того, при осмотре через "кучу" с "кучей" анализатор и Вы подозреваете, что компонент библиотеки называет явный GC, можно повернуть его от добавления: gc =-XX: + DisableExplicitGC к параметрам JVM.

0
ответ дан zxcv 24 November 2019 в 02:52
поделиться

Обычно, VM сделал бы сборку "мусора" автоматически прежде, чем бросить OutOfMemoryException, так добавление, что явный вызов не должен помогать, кроме которого это, возможно, перемещает хит производительности в более ранний момент вовремя.

Однако я думаю, что встретился со случаем, где это могло бы быть релевантно. Я не уверен, хотя, поскольку я должен все же протестировать, имеет ли это какой-либо эффект:

, Когда Вы карта распределения памяти файл, я верю карте () вызов бросает IOException, когда достаточно большой блок памяти не доступен. Сборка "мусора" незадолго до карты () файл мог бы помочь предотвратить это, я думаю. Что Вы думаете?

2
ответ дан 24 November 2019 в 02:52
поделиться

Большая часть JVMs начнет GC (в зависимости от-XX:DiableExplicitGC и-XX: + переключатель ExplicitGCInvokesConcurrent). Но спецификация просто менее четко определена для разрешения лучших реализаций позже.

спецификации нужно разъяснение: Ошибка № 6668279: (спецификация) System.gc () должен указать, что мы не рекомендуем использование и не гарантировать поведение

Внутренне метод gc, используется RMI и NIO, и они требуют синхронного выполнения, который: это в настоящее время находится в обсуждении:

Ошибка № 5025281: Позвольте System.gc () инициировать параллельный (не stop-world) полные наборы

5
ответ дан Carl Manaster 24 November 2019 в 02:52
поделиться

System.gc() реализован VM, и что он делает конкретная реализация. Лицо, осуществляющее внедрение могло просто возвратить и ничего не сделать, например.

Что касается того, когда выпустить руководство, собираются, единственное время, когда можно хотеть сделать, это - когда Вы отказываетесь от большого количества, содержащего загрузки меньших наборов - Map<String,<LinkedList>>, например - и Вы хотите попытаться получить удар перфекта прямо здесь, но по большей части, Вы не должны волноваться об этом. GC знает лучше, чем Вы - печально - большую часть времени.

10
ответ дан Narbhakshi 24 November 2019 в 02:52
поделиться

При использовании буферов непосредственной памяти JVM не выполняет GC для Вас, даже если Вы испытываете нехватку непосредственной памяти.

, Если Вы звоните ByteBuffer.allocateDirect() и Вы получаете OutOfMemoryError, можно найти, что этот вызов прекрасен после инициирования GC вручную.

8
ответ дан eckes 24 November 2019 в 02:52
поделиться

Вы не имеете никакого контроля над GC в Java - VM решает. Я никогда не натыкался на случай, где System.gc() , нуждался . Начиная с System.gc() вызов просто ПРЕДЛАГАЕТ, чтобы VM сделали сборку "мусора", и он также делает ПОЛНУЮ сборку "мусора" (старые и новые поколения в относящейся к разным поколениям "куче"), тогда он может на самом деле заставить [еще 115] циклы CPU быть использованным, чем необходимый.

В некоторых случаях, может иметь смысл предлагать VM, чтобы это сделало полный набор ТЕПЕРЬ, поскольку можно знать, что приложение будет простаивать в течение следующих нескольких минут, прежде чем тяжелый подъем произойдет. Например, прямо после инициализации большого временного объекта во время запуска приложения (т.е. я просто кэшировал ТОННУ информации, и я знаю, что не буду получать много действия в течение приблизительно одной минуты). Думайте о IDE, таком как затмение запуск - это делает много для инициализации, поэтому возможно, сразу после инициализации, имеет смысл делать полный gc в той точке.

23
ответ дан Narbhakshi 24 November 2019 в 02:52
поделиться

Необходимо быть очень осторожными, если Вы звоните System.gc(). Вызов его может добавить ненужные проблемы производительности к Вашему приложению, и это, как гарантируют, на самом деле не выполнит набор. На самом деле возможно отключить явный System.gc() через аргумент Java -XX:+DisableExplicitGC.

я настоятельно рекомендовал бы прочтение документов, доступных в сборка "мусора" Java HotSpot для больше подробно деталей о сборке "мусора".

17
ответ дан Pimgd 24 November 2019 в 02:52
поделиться

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

30
ответ дан Guillermo Vasconcelos 24 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: