Что макс. память доступна для приложений? (получение больше не обрабатывает ошибку) - PullRequest
0 голосов
/ 05 мая 2009

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 06 мая 2009

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

b) Вы можете попытаться изменить максимальное количество дескрипторов GDI или объекта User в реестре. См. здесь и здесь дополнительную информацию.

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

1 голос
/ 02 декабря 2011

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

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

1 голос
/ 05 мая 2009

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

Этот вопрос относится к Если вам нужно спросить, вы, вероятно, делаете что-то не так категорию. ; -)

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

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

1 голос
/ 05 мая 2009

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

...