Как вызвать сборку "мусора" в Java?

Вы, вероятно, пытаетесь отладить свое приложение в режиме выпуска вместо режима отладки, или Вам включили оптимизацию в Ваших настройках компиляции.

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

208
задан Columbia says Reinstate Monica 7 April 2018 в 16:14
поделиться

7 ответов

Было бы лучше, если бы вы описали причину, по которой вам нужна сборка мусора. Если вы используете SWT, вы можете удалить такие ресурсы, как Изображение и Шрифт , чтобы освободить память. Например:

Image img = new Image(Display.getDefault(), 16, 16);
img.dispose();

Существуют также инструменты для определения неиспользуемых ресурсов.

3
ответ дан 23 November 2019 в 04:41
поделиться

Your best option is to call System.gc() which simply is a hint to the garbage collector that you want it to do a collection. There is no way to force and immediate collection though as the garbage collector is non-deterministic.

159
ответ дан 23 November 2019 в 04:41
поделиться

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

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

.gc является кандидатом на удаление в будущих выпусках - инженер Sun однажды заметил, что, возможно, менее двадцати человек в мире действительно знают, как использовать .gc () - Я проделал некоторую работу в последний раз ночью в течение нескольких часов в центральной / критической структуре данных с использованием данных, сгенерированных SecureRandom, где-то около 40 000 объектов виртуальная машина замедлялась, как если бы у нее закончились указатели. Ясно, что он подавлялся в таблицах 16-битных указателей и демонстрировал классическое поведение «неисправного оборудования».

Я пробовал -Xms и так далее, продолжал вертеть бит, пока он не достиг примерно 57, xxx что-то. Затем он будет запускать gc с, скажем, 57 127 до 57 128 после gc () - примерно со скоростью раздувания кода в лагере Easy Money.

Ваш дизайн нуждается в фундаментальной переработке, возможно, с использованием подхода скользящего окна.

11
ответ дан 23 November 2019 в 04:41
поделиться

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

Вероятно, вы действительно хотели задать вопрос: «Как я могу освободить память, которую, как мне кажется, я должен освобождать сборкой мусора?»

20
ответ дан 23 November 2019 в 04:41
поделиться

The best (if not only) way to force a GC would be to write a custom JVM. I believe the Garbage collectors are pluggable so you could probably just pick one of the available implementations and tweak it.

Note: This is NOT an easy answer.

45
ответ дан 23 November 2019 в 04:41
поделиться

Really, I don't get you. But to be ясно о "бесконечном создании объектов" Я имел в виду, что есть какой-то кусок код в моей большой системе делает создание объекты, которые обрабатываются и живы в памяти, я не мог достать этот кусок код на самом деле, просто жест !!

Это правильно, только жест. У вас есть почти стандартные ответы, которые уже даны на нескольких плакатах. Давайте рассмотрим по порядку:

  1. Я не смог получить этот фрагмент кода на самом деле

Верно, на самом деле jvm не существует - это всего лишь спецификация, набор информатики, описывающий желаемое поведение ... Недавно я углубился в инициализацию объектов Java из нативного кода. Единственный способ получить то, что вы хотите, - это сделать то, что называется агрессивным обнулением. Ошибки, если они сделаны неправильно, настолько плохи, что мы должны ограничиться исходной областью вопроса:

  1. какой-то фрагмент кода в моей большой системе do creation of objects

Most of the posters here will assume you are saying you are working to an interface, if such we would have to see if you are being handed the entire object or one item at a time.

If you no longer need an object, you can assign null to the object but if you get it wrong there is a null pointer exception generated. I bet you can achieve better work if you use NIO

Any time you or I or anyone else gets: "Please I need that horribly." it is almost universal precursor to near total destruction of what you are trying to work on .... write us a small sample code, sanitizing from it any actual code used and show us your question.

Do not get frustrated. Often what this resolves to is your dba is using a package bought somewhere and the original design is not tweaked for massive data structures.

That is very common.

0
ответ дан 23 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

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