Eclipse релиз куча обратно в систему - PullRequest
3 голосов
/ 23 сентября 2010

Я использую Eclipse 3.6 с последней версией Sun Java 6 для Linux (64 бит) с большим количеством крупных проектов. В некоторых особых случаях (например, обновления SVN) Eclipse требуется до 1 ГБ кучи. Но в большинстве случаев требуется всего 350 МБ. Когда я включаю панель состояния кучи, я вижу это большую часть времени:

350М из 878М

Я запускаю Eclipse со следующими настройками: -Xms128m -Xmx1024m

Так что большую часть времени много МБ просто тратятся впустую и используются редко, когда использование памяти достигает пика в течение короткого времени. Мне это совсем не нравится, и я хочу, чтобы Eclipse вернул память обратно в систему, чтобы я мог использовать ее для других программ.

Когда Eclipse требуется больше памяти, а свободной оперативной памяти недостаточно, чем Linux может заменить другие работающие программы, я могу с этим смириться. Я слышал, что есть опция -XX: MaxHeapFreeRatio. Но я так и не понял, какие значения я должен использовать, чтобы это работало. Никакая ценность, которую я пробовал, никогда не имела значения.

Так как я могу сказать Eclipse (или Java) освободить неиспользованную кучу?

Ответы [ 3 ]

11 голосов
/ 14 февраля 2011

Нашел решение.Я переключил Java, чтобы использовать сборщик мусора G1, и теперь параметры HeapFreeRatio работают как задумано.Поэтому я использую эти параметры в eclipse.ini:

-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
-XX:MinHeapFreeRatio=5
-XX:MaxHeapFreeRatio=25

Теперь, когда Eclipse съедает более 1 ГБ ОЗУ для сложной операции и переключается обратно на 300 МБ после сборки мусора, память фактически освобождается обратнооперационная система.

2 голосов
/ 23 сентября 2010

Вы можете перейти к Preferences -> General и проверить Show heap status. Это активирует хороший вид вашей кучи в углу Eclipse. Примерно так:

alt text

Если щелкнуть корзину, она попытается запустить сборку мусора и вернуть память.

1 голос
/ 23 сентября 2010

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

JVM зависит от реализации хост-системы malloc(), которая выделяет память из системы с помощью brk().В системах Linux (тоже Solaris) память, выделенная для кучи процесса, почти никогда не возвращается, в основном потому, что она становится фрагментированной и куча должна быть смежной.Это означает, что память, выделенная для процесса, будет монотонно увеличиваться, и единственный способ уменьшить размер - не выделять его в первую очередь.

-Xms и -Xmx сообщают JVM, как измерять размеркуча Java заблаговременно, что заставляет его выделять память процесса.Java может собирать мусор до тех пор, пока не погаснет солнце, но эта очистка является внутренней для JVM, и поддержка процесса, возвращаемая ей, не возвращается.Стандартный способ для программы, написанной на C (особенно для JVM, выполняющей для вас Eclipse), выделить память malloc(3), которая использует механизм, предоставленный ОС, для выделения памяти процессу и последующего управления отдельными выделениями в этих распределениях.Детали того, как работают malloc() и free(), зависят от реализации.

В большинстве разновидностей Unix процесс получает ровно один сегмент данных, который представляет собой непрерывную область памяти с указателями на началои конец.Процесс может отрегулировать размер этого сегмента, вызвав brk(2) и увеличив указатель конца, чтобы выделить больше памяти, или уменьшив его, чтобы вернуть его в систему. Только конец можно регулировать.Это означает, что если ваша реализация malloc() увеличивает сегмент данных, соответствующая реализация free() не сможет уменьшить его, если не определит, что в конце есть место, которое не используется.На практике огромный кусок памяти, выделенный с помощью malloc(), редко попадает в самый конец сегмента данных при его free(), поэтому процессы имеют тенденцию монотонно расти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...