SWT Нет больше ручек
Windows XP имеет ограничение на 10000 пользовательских дескрипторов для каждого процесса и общее 32000 для каждого сеанса рабочего стола. Однако, когда я запускаю 4 или 5 SWT-процессов, каждый из которых потребляет не более 2000 пользовательских дескрипторов, исключение SWT No More обрабатывает всегда.
Кто-нибудь знает, почему?
Ответы
Ответ 1
Если я вас правильно понимаю, вы, вероятно, получаете следующее исключение:
org.eclipse.swt.SWTError: No more handles
Возможно, вы создаете ресурсы (такие как объекты Font
, Image
или GC
), которые вы неправильно распределяете. Вам может понадобиться немного времени, чтобы прочитать руководство SWT по управлению ресурсами операционной системы.
Чтобы определить, действительно ли это так, я могу порекомендовать эту полезную статью: Диагностика утечек дескрипторов в приложениях Windows SWT/RCP, которая объясняет, что такое ресурсы, и предлагает использовать Process Explorer или DPus для обнаружения утечек.
Коллега также настоятельно рекомендует Sleak, ориентированное на SWT приложение, которое может фактически информировать вас о том, какие ресурсы остаются в остаточной памяти.
Для очень технического понимания того, что делает дескриптор SWT, в этой статье Sybase описывается три типа: дескриптор объекта пользователя, объект GDI или объект ядра, каждый из которых имеет свой максимум.
Ответ 2
У вас скорее всего есть утечка ресурсов в вашей программе. Используйте следующую утилиту (http://www.eclipse.org/articles/swt-design-2/sleak.htm) как простой способ найти утечки ресурсов swt. Я использовал его для очистки целого множества проблем в приложении rcp, над которым я работал над
Ответ 3
Предел не 10000 ручек. Приложения могут использовать гораздо больше, чем 10000 ручек (если позволяет RAM). Предел находится в ресурсах GDI и User (графические элементы).
Какими ресурсами пользуются приложения SWT (вы можете увидеть это с помощью taskmgr)? Это поможет понять, что протекает.
Ответ 4
Для записи, если бы это был мой вопрос, я бы принял @Paul ответ. Тем не менее, есть одна непроницаемая проблема, которую я хотел бы добавить здесь, чтобы потенциально помочь кому-то другому, если они сталкиваются с этой проблемой...
Проверьте использование шрифтов.
В моем случае мои дескрипторы не были такими высокими, но вместо этого я был новым экземпляром шрифтов и передавал их стилю StyledText. Мне пришлось вместо этого объявлять шрифты, которые я хотел использовать один раз, уровень класса. Это исправило это для меня.
Ответ 5
Я тоже видел эту ошибку в eclipse 3.6 SR1, это оказалось вызвано тем, что сотни вкладок редактора остаются открытыми. Закрытие вкладок фиксировало ошибку.
Ответ 6
Попробуйте выполнить следующие шаги:
- перейдите в домашний каталог eclipse (где вы установили eclipse), затем перейдите в папку плагинов
- удалить все недавно установленные плагины, начиная с com.google. *
- повторите попытку перезапуска вашего затмения, он может снова начать работать (работал у меня.)
- попробуйте установить старые плагины из Google или только один раз, что вам нужно. (Я собираюсь попробовать это.)
Ответ 7
В моей системе Windows7 x64 я могу воспроизвести его, когда работает TeamViewer 8 (www.teamviewer.com). Когда я останавливаю TeamViewer, ошибка исчезает.
вы можете посмотреть: https://bugs.eclipse.org/bugs/show_bug.cgi?id=402983
Надеюсь, что это поможет.
Ответ 8
Я также встретил эту проблему, но теперь я ее решил.
В моем случае я запускаю Win7 с пакетом обновления 1 (SP1) и Spring Tool Suite 3.7.2 (Eclipse Mars 4.5.1) через Citrix XenApp. Эта ошибка возникает, когда я переключаюсь между обозревателем пакетов и редактором Java.
Мое решение: запустить run.msc в Win7, найти "Служба ввода Tablet PC", остановить его.
Надеюсь, это может помочь другим.