Как заставить сборку мусора на Java?

Можно ли принудительно вывести сборку мусора на Java, даже если это сложно? Я знаю о System.gc(); и Runtime.gc(); но они предлагают только GC. Как я могу заставить GC?

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

Библиотека jlibs имеет хороший class утилиты для сбора мусора . Вы можете принудительно собрать garbage collection, используя отличный небольшой трюк с объектами WeakReference .

RuntimeUtil.gc () из jlibs:

  /** * This method guarantees that garbage collection is * done unlike {@link System#gc()} */ public static void gc() { Object obj = new Object(); WeakReference ref = new WeakReference(obj); obj = null; while(ref.get() != null) { System.gc(); } } 

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

Примечание. Это НЕ простой ответ.

Используя интерфейс Java ™ Virtual Machine Tool (JVM TI) , функция

 jvmtiError ForceGarbageCollection(jvmtiEnv* env) 

«заставит виртуальную машину выполнять garbage collection». JVM TI является частью архитектуры отладчика платформы JavaTM (JPDA) .

ДА почти невозможно заставить вас вызвать методы в том же порядке, и в то же время это:

 System.gc (); System.runFinalization (); 

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

ОДНАКО, это ужасная практика использования сборщика мусора, поскольку его использование может привести к чрезмерной нагрузке на программное обеспечение, которое может быть даже хуже, чем в памяти, сборщик мусора имеет свой собственный stream, который невозможно контролировать плюс в зависимости от алгоритм, используемый gc, может занять больше времени и считается очень неэффективным, вы должны проверить свое программное обеспечение, если оно хуже с помощью gc, потому что оно определенно сломано, хорошее решение не должно зависеть от gc.

ПРИМЕЧАНИЕ. Просто помните, что это будет работать только в том случае, если метод finalize не является переназначением объекта, если это произойдет, объект будет продолжать жить, и это будет иметь воскресение, которое технически возможно.

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

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

Чтобы вручную запросить GC (не из System.gc ()):

  1. Перейти к: папка bin в JDK eg.-C: \ Program Files \ Java \ jdk1.6.0_31 \ bin
  2. Открыть jconsole.exe
  3. Подключитесь к желаемому локальному процессу.
  4. Перейдите на вкладку «Память» и нажмите «Выполнять GC».

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

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

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

Спецификация JVM не говорит ничего конкретного о сборке мусора. Благодаря этому поставщики могут свободно внедрять GC на своем пути.

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

Полезно для партии / crontab:

jdk1.7.0 / bin / jcmd GC.run

Видеть :

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

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

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

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

Используйте Runtime.getRuntime().gc() или используйте служебный метод System.gc()

На самом деле, я тебя не понимаю. Но чтобы быть понятным о «создании бесконечного объекта», я имел в виду, что в моей большой системе есть какой-то fragment кода, который создает объекты, которые обрабатывают и оживляют в памяти, я не мог получить этот кусок кода на самом деле, просто жест!

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

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

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

  1. некоторый fragment кода в моей большой системе делает создание объектов

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

Если вам больше не нужен объект, вы можете назначить null объекту, но если вы ошибетесь, генерируется исключение с нулевым указателем. Бьюсь об заклад, вы можете добиться лучшей работы, если используете NIO

Каждый раз, когда вы или я или кто-либо другой получаем: « Пожалуйста, мне нужно это ужасно». Это почти универсальный предшественник почти полного уничтожения того, над чем вы пытаетесь работать …. напишите нам небольшой пример кода, дезинфицируя его используемый фактический код и покажите нам свой вопрос.

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

Это очень распространено.

Если у вас заканчивается память и вы получаете OutOfMemoryException вы можете попытаться увеличить количество кучи, доступное для java, запустив программу с java -Xms128m -Xmx512m вместо java . Это даст вам начальный размер кучи 128 МБ и максимум 512 Мб, что намного больше, чем стандартный 32 Мб / 128 МБ.

(Извините, я не могу добавить это как комментарий, поскольку у меня недостаточно очков репутации.)

Я когда-то брал интервью у компании по обработке изображений для Java-работы (хотя у меня не было никакого опыта java).

Их рассказ о горе, который был мне интересен, заключался в том, что их программа выделила бы БОЛЬШОЙ буфер для изображения. Однажды, они были сделаны с изображением и памятью, они будут уважать его. Зная, что им действительно нужно восстановить память раньше, чем позже, они попытались использовать явный вызов Java gc () в течение тихого времени программы. К сожалению, gc () является всего лишь предложением для среды выполнения Java и не имеет никакого эффекта.

Насколько я помню, им пришлось перерабатывать память.

FYI

Вызов метода System.runFinalizersOnExit (true) гарантирует, что методы finalizer вызывают до того, как Java отключится. Однако этот метод по своей сути является небезопасным и устарел. Альтернативой является добавление «выключения крючков» с помощью метода Runtime.addShutdownHook.

Масаррат Сиддики

Существует косвенный способ принудительного сбора сборщика мусора. Вам просто нужно заполнить кучу временными объектами до момента, когда будет выполнен сборщик мусора. Я создал class, который таким образом заставляет сборщик мусора:

 class GarbageCollectorManager { private static boolean collectionWasForced; private static int refCounter = 0; public GarbageCollectorManager() { refCounter++; } @Override protected void finalize() { try { collectionWasForced = true; refCounter--; super.finalize(); } catch (Throwable ex) { Logger.getLogger(GarbageCollectorManager.class.getName()).log(Level.SEVERE, null, ex); } } public int forceGarbageCollection() { final int TEMPORARY_ARRAY_SIZE_FOR_GC = 200_000; int iterationsUntilCollected = 0; collectionWasForced = false; if (refCounter < 2) new GarbageCollectorManager(); while (!collectionWasForced) { iterationsUntilCollected++; int[] arr = new int[TEMPORARY_ARRAY_SIZE_FOR_GC]; arr = null; } return iterationsUntilCollected; } } 

Применение:

 GarbageCollectorManager manager = new GarbageCollectorManager(); int iterationsUntilGcExecuted = manager.forceGarbageCollection(); 

Я не знаю, насколько этот метод полезен, потому что он заполняет кучу постоянно, но если у вас есть критически важное приложение, которое ДОЛЖНО принудительно использовать GC - когда это может быть переносимый Java-способ принудительного GC.

Я хотел бы добавить кое-что здесь. Пожалуйста, не то, что Java работает на виртуальной машине, а не на самом деле. Виртуальная машина имеет свой собственный способ связи с машиной. Он может изменяться от системы к системе. Теперь, когда мы вызываем GC, мы просим виртуальную машину Java вызвать сборщик мусора.

Поскольку сборщик мусора с виртуальной машиной, мы не можем заставить его делать очистку там и тогда. Скорее, мы заказываем наш запрос с Мусороуборочной машиной. Это зависит от виртуальной машины, после определенного времени (это может измениться из системы в систему, как правило, когда пороговая память, выделенная для JVM, заполнена), фактическая машина освободит пространство. : D

Следующий код берется из метода assertGC (…). Он пытается заставить сборщика мусора не детерминироваться.

  List alloc = new ArrayList(); int size = 100000; for (int i = 0; i < 50; i++) { if (ref.get() == null) { // Test succeeded! Week referenced object has been cleared by gc. return; } try { System.gc(); } catch (OutOfMemoryError error) { // OK } try { System.runFinalization(); } catch (OutOfMemoryError error) { // OK } // Approach the jvm maximal allocatable memory threshold try { // Allocates memory. alloc.add(new byte[size]); // The amount of allocated memory is increased for the next iteration. size = (int)(((double)size) * 1.3); } catch (OutOfMemoryError error) { // The amount of allocated memory is decreased for the next iteration. size = size / 2; } try { if (i % 3 == 0) Thread.sleep(321); } catch (InterruptedException t) { // ignore } } // Test failed! // Free resources required for testing alloc = null; // Try to find out who holds the reference. String str = null; try { str = findRefsFromRoot(ref.get(), rootsHint); } catch (Exception e) { throw new AssertionFailedErrorException(e); } catch (OutOfMemoryError err) { // OK } fail(text + ":\n" + str); 

Источник (я добавил несколько комментариев для ясности): пример NbTestCase

Лучшим (если не единственным) способом заставить GC было бы написать пользовательскую JVM . Я считаю, что Garbage collectors подключаются, поэтому вы, возможно, просто выберите одну из доступных реализаций, настройте ее.

  • Как можно исключить исключения Event Dispatch Thread (EDT)?
  • Простое использование веб-службы в Java
  • Http Basic Authentication в Java с использованием HttpClient?
  • Что случилось с использованием ассоциативности компиляторами?
  • Какова наилучшая практика написания hash-функции в java?
  • Как работает цикл Java для каждого цикла?
  • Отображение сервлета с использованием web.xml
  • Выбор лучшего списка параллелизма в Java
  • java: запустить функцию через определенное количество секунд
  • rmi server, classnotfound
  • В этой среде компилятор не предоставляется. Возможно, вы работаете на JRE, а не на JDK?
  • Давайте будем гением компьютера.