web-dev-qa-db-fra.com

SWT plus de poignées

Windows XP est limité à 10 000 par utilisateur pour chaque processus et à 32 000 par session de bureau. Toutefois, lorsque j'exécute 4 ou 5 processus SWT, chacun ne consommant pas plus de 2 000 poignées utilisateur, l'exception SWT No More sera toujours renvoyée.

Quelqu'un sait-il pourquoi?

25
James

Si je vous ai bien compris, vous obtenez probablement l'exception suivante:

org.Eclipse.swt.SWTError: No more handles

Vous créez peut-être des ressources (telles que des objets Font, Image ou GC) que vous ne supprimez pas correctement. Vous voudrez peut-être prendre un moment pour lire le guide SWT sur Gestion des ressources du système d'exploitation .

Pour déterminer s'il en est bien ainsi, je peux recommander cet article utile: Diagnostic des fuites de descripteurs dans les applications SWT/RCP , qui explique les ressources et suggère d'utiliser Process Explorer ou DPus localiser les fuites.

Un collègue recommande également fortement Sleak , une application centrée sur SWT qui peut réellement vous informer des ressources restantes dans la mémoire résiduelle.

Pour une compréhension très technique de la gestion de SWT, cet article Sybase décrit il en existe trois types: objet utilisateur, objet GDI ou objet noyau, chacun ayant son propre maximum.

42
Paul Lammertsma

Vous avez probablement une sorte de fuite des ressources dans votre programme. Utilisez l’utilitaire suivant ( http://www.Eclipse.org/articles/swt-design-2/sleak.htm ) pour localiser facilement les fuites de ressources swt. Je l'ai utilisé pour nettoyer toute une série de problèmes dans une application RCP sur laquelle je travaillais

7
fisherja

La limite n'est pas 10000 poignées. Les applications peuvent utiliser plus de 10 000 descripteurs (si RAM le permet). La limite concerne GDI et les ressources utilisateur (éléments graphiques).

Quel type de ressources les applications SWT utilisent-elles (vous pouvez le voir avec taskmgr)? Cela aiderait à comprendre ce qui fuit.

2
Larry Osterman

J'ai également constaté cette erreur dans Eclipse 3.6 SR1. Des centaines d'onglets d'éditeur sont restés ouverts. La fermeture des onglets a corrigé l'erreur.

1
Adam

Pour mémoire, si telle était ma question, j'aurais accepté la réponse de @ Paul. Cependant, il y a un problème sournois que j'aimerais ajouter ici pour aider potentiellement quelqu'un d'autre s'il rencontre ce problème ...

Vérifiez votre utilisation des polices.  

Dans mon cas, mes poignées n'étaient pas très hautes, mais je créais plutôt des instances de polices et les transmettais au style StyledText. Je devais plutôt déclarer les polices que je voulais utiliser une fois, au niveau de la classe. Cela a résolu le problème pour moi.

1
javamonkey79

J'ai également rencontré ce problème, mais maintenant je l'ai résolu.

Dans mon cas, j'exécute Win7 avec SP1 et Spring Tool Suite 3.7.2 (Eclipse Mars 4.5.1) via Citrix XenApp. Cette erreur se produit lorsque je bascule entre Explorateur de packages et Java Editor .

Ma solution: 
exécutez services.msc dans Win7, recherchez «Service d’entrée pour Tablet PC», arrêtez-le.

J'espère que cela pourra aider les autres.

0
Ivan

Essayez les étapes suivantes:

  • allez dans le répertoire principal Eclipse (où vous avez installé Eclipse), puis dans le dossier plugins. 
  • supprime tous les plugins d'installation récents commençant par com.google. * 
  • essayez de redémarrer votre Eclipse à nouveau, il peut recommencer à fonctionner (a travaillé pour moi.)
  • essayez d'installer d'anciens plugins à partir de Google ou juste une fois dont vous avez besoin. (Je vais essayer ça.)
0
user3740344

Sur mon système Windows 7 x64, je peux le reproduire lorsque TeamViewer 8 est en cours d'exécution (www.teamviewer.com). Lorsque j'arrête TeamViewer, le bogue disparaît. 

vous pouvez regarder dans: https://bugs.Eclipse.org/bugs/show_bug.cgi?id=402983

J'espère que cela pourra aider.

0