Avec un Peu d'Aide de la JVM...
AVERTISSEMENT: Cette solution est aujourd'hui obsolète dans les nouvelles versions de Java SE. Voir d'autres ad-hoc, des solutions plus ci-dessous.
Si vous utilisez un HotSpot de la JVM, depuis Java 6 update 21, vous pouvez utiliser cette option de ligne de commande:
-XX:+UseCompressedStrings
Les Options JVM page se lit comme suit:
Utiliser un byte[] pour les Chaînes de caractères qui peut être représenté comme pur ASCII. (Présenté
dans Java 6 Update 21 la Libération des Performances)
Mise à JOUR: Cette fonctionnalité a été cassé dans une version ultérieure et doit être fixé à nouveau en Java SE 6u25, comme mentionné par l' 6u25 b03 notes de version (mais nous ne le voyez pas dans la 6u25 sortie de la version finale des notes). Le rapport de bug 7016213 n'est pas visible pour des raisons de sécurité. Donc, à utiliser avec précaution et vérifiez d'abord. Comme n'importe quel -XX
option, il est considéré comme expérimental et sous réserve de modification sans préavis, donc c'est probablement pas toujours préférable de ne pas les utiliser que dans le sac de démarrage d'un serveur de production.
Mise à JOUR 2013-03 (grâce à un commentaire par Aleksey Maximus): Voir cette question relative à la et son a accepté de répondre. L'option semble être maintenant décédé. Ceci est confirmé dans le bug 7129417 rapport.
La Fin Justifie les Moyens
Avertissement: (Laid) des Solutions pour des Besoins Spécifiques
C'est un peu hors de la boîte et de niveau inférieur, mais puisque vous le demandez... ne frappez pas sur le messager!
Votre Propre Plus Léger Représentation De Chaîne
Si ASCII est très bien pour vous, alors pourquoi ne pas vous juste dans le déploiement de votre propre mise en œuvre?
Comme vous l'avez mentionné, vous pourriez byte[]
au lieu de char[]
en interne. Mais ce n'est pas tout.
Pour faire encore plus léger, au lieu d'emballer vos tableaux d'octets dans une classe, pourquoi ne pas simplement utiliser une classe d'aide contenant essentiellement des méthodes statiques d'exploitation sur ces tableaux d'octets que vous passer? Bien sûr, il va se sentir assez C-ish, mais il pourrait fonctionner, et serait vous faire économiser de l' énorme surcharge qui va avec, String
objets.
Et bien sûr, il manquerait quelques belles fonctionnalités... à moins que votre re-mettre en œuvre. Si vous avez vraiment besoin d'eux, alors il n'y a pas beaucoup de choix. Grâce à OpenJDK et beaucoup d'autres bons projets, vous pourriez très bien dans le déploiement de votre propre fugly LiteStrings
de la classe qui vient de fonctionner sur byte[]
paramètres. Vous aurez envie de prendre une douche à chaque fois que vous avez besoin pour appeler une fonction, mais vous aurez sauvé des tas de mémoire.
Je vous recommande de la faire ressembler de près l' String
classe du contrat et de fournir des cartes et des constructeurs pour convertir de et vers String
, et vous pouvez aussi avoir des adaptateurs vers et à partir d' StringBuffer
et StringBuilder
, ainsi que certaines miroir implémentations d'autres choses que vous pourriez avoir besoin. Certainement un morceau de travail, mais pourrait être mieux (voir un peu en dessous de la "Faites que ça compte!" de la section).
Sur la Volée de Compression/Décompression
Vous pourriez très bien compresser vos chaînes en mémoire et de les décompresser à la volée lorsque vous en avez besoin. Après tout, vous avez seulement besoin d'être en mesure de les lire lorsque vous y accédez, à droite?
Bien sûr, étant que les violents signifie:
- plus complexe (donc moins facile à gérer) du code,
- plus de puissance de traitement,
- relativement longues chaînes sont nécessaires pour le type de compression (ou de compact de plusieurs chaînes en un seul par la mise en œuvre de votre propre système magasin, à la compression plus efficace).
Faire Les Deux
Pour un mal de tête, bien sûr, vous pouvez faire tout cela:
- C-ish de la classe helper,
- tableaux d'octets,
- à la volée comprimé magasin.
Assurez-vous que l'open source. :)
Faites que ça compte!
Par le chemin, voir ce grand exposé sur la Construction Efficace de la Mémoire des Applications Java par N. Mitchell et G. Sevitsky: [version 2008], [version 2009].
À partir de cette présentation, nous voyons que l' 8-chaîne de char mange 64 octets sur un système 32 bits (96 pour un système 64 bits!!), et la plupart de cela est dû à la JVM de frais généraux. Et à partir de cet article , nous voyons que l' 8-tableau d'octets de manger "que" 24 octets: 12 octets d'en-tête, 8 x 1 octet + 4 octets de l'alignement).
Semble que cela pourrait être utile si vous avez vraiment manipuler un grand nombre de ce genre de choses (et éventuellement d'accélérer un peu les choses, comme vous voulez passer moins de temps à allouer de la mémoire, mais ne pas me citer sur ce point de repère et il; et il dépendra grandement sur votre mise en œuvre).