2015-03-11 6 views
-6

После прочтения this & & this Мне рекомендовали использовать C/C++, которые имеют приятные функции для распределения памяти.Сборщик мусора иногда не работает

Пример: У меня есть приложение, которое делает 5000 JMenuItems (мне не нужен JTable). Объем памяти достигает 400 МБ. Когда я удаляю все из них, память идет (380--390) МБ, и я жду 2-3 минуты.

Зачем нужен сборщик мусора, а не метод free(), когда он не освобождает память по мере необходимости? Кроме того, никаких утечек памяти не существует, насколько я знаю, и я использую Java 1.8.0_25.

После теста на 64-битным приложением: сборщик мусора, как я испытал просто не освобождает память, которую он держит 1gb памяти, даже если я удалил 5.000.000 утечки памяти buttons.About (я просто добавить эти кнопки в список, а затем удалить их с помощью метода removeAll() или removeItem(), готового java-библиотекой).

Спасибо!

+0

Слово, которое вы ищете: * Мусор *. ... И GC работает, читайте об этом немного больше. Minor/Major GC, что вам нужно, чтобы обойтись без него и т. Д. –

+1

Обратите внимание, что ни 'free()', ни 'delete' не гарантирует, что память будет возвращена операционной системе. Назначение 'free',' delete' или сборка мусора - это позволить памяти, которая использовалась одним объектом для повторного использования другим объектом.Java-GC выполняет эту задачу. – ruakh

+0

@RealSkeptic Я хотел сделать это более реалистичным :). – crAlexander

ответ

3

Почему мне нужно сборщика мусора, а не способ бесплатно(), если она не освобождает память, как требуется?

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

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

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

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

+0

приятный ответ. Я подчеркиваю, что моя java-программа взорвется, когда будет выделена максимальная память. Пользователь, который будет использовать приложение, может иметь 1 ГБ оперативной памяти и когда память достигает этого (взорваться), даже если программа имеет 5 элементов, а не 5.000. 000, которым необходимо достичь этой памяти. – crAlexander

+2

Нет, он не взорвется. Как только он увидит, что у него больше нет памяти, он будет запускать сборку мусора. – RealSkeptic

+0

славный здесь сборщик мусора, поскольку я протестировал просто не освобождаю память, в которой он хранит 1 гб памяти, даже если я удалил 5.000.000 кнопок. О утечке памяти (я просто добавляю эту кнопку в список, а затем удаляю их с помощью метода removeAll() или removeItem(), готовый java-библиотекой). – crAlexander

Смежные вопросы