2009-05-05 3 views
0

В приложении RCP Eclipse я пытаюсь открыть много редакторов. Это в основном дерево с множеством узлов, каждый из которых открывает редактор. Когда я открываю доступ к 150-200 редакторам и пытаюсь открыть редактор для следующего treenode, он не открывается. Консоль Eclipse показывает «org.eclipse.swt.SWTError: больше никаких ручек». Однако, если я закрою несколько уже открытых редакторов, я могу открыть столько новых редакторов treenode.Что такое макс. память доступна для приложений? (ошибка получения больше ошибок)

Я отслеживал использование памяти для javaw.exe; память растет при открытии каждого редактора, но количество ручек остается постоянным после некоторого MAX. При возникновении ошибки javaw.exe потребляет около 120 000K. Общая память, потребляемая всеми приложениями при ошибке, составляет 700 000 К. И если я попытаюсь открыть еще несколько приложений, таких как IE, то он либо не открывается, либо не открывается с меньшими возможностями пользовательского интерфейса из-за нехватки системной памяти. И все это, несмотря на наличие 2 ГБ оперативной памяти!

Я также пытался увеличить vmargs в настройках памяти eclipse, но это тоже не помогло.

a) Есть ли утечка памяти в моем коде? Я не вижу, чтобы ручки оставались постоянными после некоторого MAX. Насколько я понимаю, поскольку редакторы открыты, элементы управления SWT на нем не расположены до тех пор, пока они не будут закрыты.

b) Что такое макс. памяти, которая может быть использована приложениями? Поскольку моя оперативная память составляет 2 ГБ, и я вижу, что моя общая память для всех процессов должна быть лучше, чем 700 000 К, что, я думаю, составляет около 680 МБ.

ответ

1

Я не могу ответить конкретно на ваш вопрос, но, похоже, вы используете максимальный предел открытых файлов, которые процесс может иметь в любой момент (судя по термину «ручки», который часто относится к открытым файлам, как дескрипторы файлов в Unix). Тогда это зависит от пользовательских разрешений/возможностей на уровне операционной системы. Разрешенное количество открытых файлов не имеет ничего общего с размером памяти.

1

Ручки относятся к дескрипторам файлов (открытые ссылки на файлы) и управляются операционной системой. Обычно это не пользовательский параметр, потому что хранение большого количества дескрипторов файлов открывает неограниченное количество ресурсов ОС ОС.

Этот вопрос относится к категории If you have to ask, you're probably doing something wrong. ;-)

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

Если вы не хотите менять слишком много логики, это может помочь открыть + прочитать + закрыть каждый файл, когда вы поместите его в дерево, а затем снова запустите (для записи) тот, который в настоящее время находится в активного пользователя, закрывая их, когда пользователь перемещается.

2

a) Попробуйте Sleak. Он может найти утечки GDI в вашем SWT-приложении

b) Вы можете попробовать изменить максимальные дескрипторы GDI или объект User в реестре. См. here и here.

Вы также можете попытаться создать vitual tree так, чтобы были созданы только отображаемые узлы дерева.

+0

+1 для справки sleak - это очень удобный инструмент – Jared

1

Windows имеет дело с несколькими видами ручек, например. исполнительные ручки (файлы, потоки), дескрипторы GDI (шрифты, кисти, контексты устройств), ручки пользователя (окна, меню, большинство встроенных элементов управления, изображения). Для большинства этих ручек существует общий процесс и общий системный предел, который не имеет никакого отношения к количеству оперативной памяти, доступной в вашей системе. Например.из-за исторических причин существует ограничение на 10000 пользовательских дескрипторов для каждого процесса и ограничение 32000 пользовательских дескрипторов на сеанс рабочего стола. См. http://msdn.microsoft.com/en-us/library/ms810501.aspx для подробного описания ручек.

Итак, сначала вам нужно убедиться, что вы не пропускаете никаких ручек, например. используя Sleak. Затем вам нужно знать, что SWT использует по крайней мере один дескриптор пользователя для каждого виджета (да даже для простых объектов Composite). Если у вас большое приложение с большим количеством виджетов, вы достигнете предела 10000 пользовательских объектов. Я написал короткую запись в блоге о том, что мы сделали, чтобы обойти этот предел в нашем продукте: http://www.subshell.com/en/subshell/blog/investigating-user-handles-with-the-swt-detective100.html. Я также взломал SWT Spy в инструмент, который позволяет мне исследовать дерево виджетов нашего приложения, чтобы найти места, чтобы уменьшить количество виджетов. Ссылка для загрузки этого инструмента находится в блоге.