Здравствуйте,
Столкнулся с интересной проблемой:
Проект Swing + J2SE, множество классов, инстансов, поэтому имеет место дефицит памяти.
Я обнуляю ссылки, но почему-то GC не запускается т.е. память не освобождается и так может продолжаться часами. Но как только я делаю minimize и maximize главному окну программы, то все сразу освобождается и все хорошо.
Может происходит какой-нибудь event для GC?
Буду очень благодарен за любую помощь.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, А>Столкнулся с интересной проблемой: А>Проект Swing + J2SE, множество классов, инстансов, поэтому имеет место дефицит памяти. А>Я обнуляю ссылки, но почему-то GC не запускается т.е. память не освобождается и так может продолжаться часами. Но как только я делаю minimize и maximize главному окну программы, то все сразу освобождается и все хорошо. А>Может происходит какой-нибудь event для GC? А>Буду очень благодарен за любую помощь.
А>Спасибо
Обнулять ссылки надо только для того, чтобы GarbageCollector мог почистить память, занимаемую объектами, на которые ссылки и ведут, не более. Сборка мусора запускается тогда, когда JVM посчитает это нужным, и никакие вызовы System.gc() реально не помогут (хотя вызывать, конечно, можно). Если сборка не запускается — значит текущего количества свободной памяти достаточно
Re[2]: event и Запуск GC
От:
Аноним
Дата:
23.03.07 17:46
Оценка:
Здравствуйте, JSerge, Вы писали:
JS>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, А>>Столкнулся с интересной проблемой: А>>Проект Swing + J2SE, множество классов, инстансов, поэтому имеет место дефицит памяти. А>>Я обнуляю ссылки, но почему-то GC не запускается т.е. память не освобождается и так может продолжаться часами. Но как только я делаю minimize и maximize главному окну программы, то все сразу освобождается и все хорошо. А>>Может происходит какой-нибудь event для GC? А>>Буду очень благодарен за любую помощь.
А>>Спасибо
JS>Обнулять ссылки надо только для того, чтобы GarbageCollector мог почистить память, занимаемую объектами, на которые ссылки и ведут, не более. Сборка мусора запускается тогда, когда JVM посчитает это нужным, и никакие вызовы System.gc() реально не помогут (хотя вызывать, конечно, можно). Если сборка не запускается — значит текущего количества свободной памяти достаточно
В том-то и дело, что программа ест память и падает на Out of memory, а сделаешь ей minimize maximize и все очищается, прямо не знаю что делать...
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, JSerge, Вы писали:
А>В том-то и дело, что программа ест память и падает на Out of memory, а сделаешь ей minimize maximize и все очищается, прямо не знаю что делать...
Да увеличь выделяемую программе память.
Параметры -Xms128m -Xmx512m при запуске (циферки свои можешь поставить)
Здравствуйте, JSerge, Вы писали: JS>Обнулять ссылки надо только для того, чтобы GarbageCollector мог почистить память, занимаемую объектами, на которые ссылки и ведут, не более. Сборка мусора запускается тогда, когда JVM посчитает это нужным, и никакие вызовы System.gc() реально не помогут (хотя вызывать, конечно, можно). Если сборка не запускается — значит текущего количества свободной памяти достаточно
Вместо того, чтобы говорить бред — стоит написать тестовую программу (или поставить IDEA) и проверить.
System.gc() реально запускает мусоросборщик. Кстати, обычно это делается и при minimize.
Здравствуйте, Аноним, Вы писали:
А>Буду очень благодарен за любую помощь.
Во-первых, надо проверить программу профилятором — может там утечки памяти есть.
Во-вторых, покрутить настройки GC — http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, JSerge, Вы писали: JS>>Обнулять ссылки надо только для того, чтобы GarbageCollector мог почистить память, занимаемую объектами, на которые ссылки и ведут, не более. Сборка мусора запускается тогда, когда JVM посчитает это нужным, и никакие вызовы System.gc() реально не помогут (хотя вызывать, конечно, можно). Если сборка не запускается — значит текущего количества свободной памяти достаточно
C>Вместо того, чтобы говорить бред — стоит написать тестовую программу (или поставить IDEA) и проверить. C>System.gc() реально запускает мусоросборщик. Кстати, обычно это делается и при minimize.
Можно пример кода, демострирующий, что явный System.gc() помогает избежать OOM?
...Calling this method suggests that the Java virtual machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse...
C>>... C>>System.gc() реально запускает мусоросборщик. Кстати, обычно это делается и при minimize. B>Не, ну это ты зря. B>Runtime.gc() B>
B>...Calling this method suggests that the Java virtual machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse...
System.gc()
/**
* Runs the garbage collector.
* <p>
* Calling the <code>gc</code> method suggests that the Java Virtual
* Machine expend effort toward recycling unused objects in order to
* make the memory they currently occupy available for quick reuse.
* When control returns from the method call, the Java Virtual
* Machine has made a best effort to reclaim space from all discarded
* objects.
* <p>
На практике во всех JVM, которые я видел, System.gc() вызывает полный цикл сборки.
Здравствуйте, Cyberax, Вы писали:
C>На практике во всех JVM, которые я видел, System.gc() вызывает полный цикл сборки.
не имея ни малейшего желания ввязываться в этот, поднимаемый уже в 65535й раз спор, предположу, что сиё утверждение можно побороть параметрами jvm, задаваемыми в командной строке. при этом, как я понимаю, внутри программы проанализировать, как именно запараметризовали jvm, нормальным способом не удастся
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, А>Столкнулся с интересной проблемой: А>Проект Swing + J2SE, множество классов, инстансов, поэтому имеет место дефицит памяти. А>Я обнуляю ссылки, но почему-то GC не запускается т.е. память не освобождается и так может продолжаться часами. Но как только я делаю minimize и maximize главному окну программы, то все сразу освобождается и все хорошо. А>Может происходит какой-нибудь event для GC? А>Буду очень благодарен за любую помощь.
А>Спасибо
Есть забавный подход — код, который может кинуть OoE, обрамлять в try-catch(OoE) и в catch-блоке делать попытки сбора мусора. И соот-но, после успешной (как определить успешность? А хрен знает. Можно разницу между freeMem-было и freeMem-стало смотреть) сборки пробовать вызывать тот код, который может кинуть OoE
Причем "попытки сбора мусора" — это не просто один вызов System.gc(), а несколько (раз пять), причем с промежутками (Thread.sleep()) между вызовами по 0.1..0.2 сек — так чтобы примерно до секунды общего простоя набиралось.
Здравствуйте, C0s, Вы писали:
C0s>не имея ни малейшего желания ввязываться в этот, поднимаемый уже в 65535й раз спор, предположу, что сиё утверждение можно побороть параметрами jvm, задаваемыми в командной строке. при этом, как я понимаю, внутри программы проанализировать, как именно запараметризовали jvm, нормальным способом не удастся