Question

Je suis en train d'écrire un codec pour traiter les messages envoyés via TCP en utilisant un protocole sur mesure fil. Au cours du processus de décodage je crée un certain nombre de Strings, BigDecimals et dates. Les modèles d'accès client-serveur signifie qu'il est courant pour le client d'émettre une demande et décode des milliers de messages de réponse, ce qui se traduit par un grand nombre de double Strings, BigDecimals, etc.

J'ai donc créé une classe InternPool<T> me permettant de stagiaire chaque classe d'objet. En interne, la piscine utilise un WeakHashMap<T, WeakReference<T>>. Par exemple:

InternPool<BigDecimal> pool = new InternPool<BigDecimal>();

...

// Read BigDecimal from in buffer and then intern.
BigDecimal quantity = pool.intern(readBigDecimal(in));

Ma question: J'utilise InternPool pour BigDecimal, mais dois-je utiliser Voir également pour String au lieu de la méthode de String de intern(), que je crois utilise l'espace PermGen? Quel est l'avantage d'utiliser l'espace PermGen?

Était-ce utile?

La solution

Il est probable que sera plus rapide piscine de String.intern() de la machine virtuelle Java. Autant que je sache, il est mis en œuvre dans le code natif, donc il devrait être plus rapide et utiliser moins d'espace qu'une piscine mis en œuvre en utilisant WeakHashMap et WeakReference. Vous devez faire une analyse comparative minutieuse pour le confirmer.

Cependant, à moins que vous avez un très grand nombre d'objets en double à long terme, je doute que interné (soit en PermGen ou avec vos propres piscines) fera beaucoup de différence. Et si le rapport unique de dupliquer des objets est trop faible, alors interné va simplement augmenter le nombre d'objets vivants (rendant le GC prennent plus de temps) et réduire les performances en raison des frais généraux d'interner, et ainsi de suite. Donc, je préconiserais également l'analyse comparative du « stagiaire » versus « non stagiaire » approche.

Autres conseils

Si vous avez déjà une telle classe InternPool, il pense qu'il est préférable d'utiliser ce que de choisir une autre méthode interner pour cordes. D'autant plus que String.intern() semble donner une garantie beaucoup plus forte que vous avez réellement besoin. Votre but est de réduire l'utilisation de la mémoire, si parfait pour interner la durée de vie de la machine virtuelle Java est pas réellement nécessaire.

En outre, je voudrais utiliser le Google Collections

scroll top