Dans l'OP, votre programme s'interrompt pendant que le StringBuffer
est en cours de développement. Vous devriez préallouer cela à la taille dont vous avez besoin ou du moins à proximité. Lorsque StringBuffer
doit se développer, il a besoin de RAM pour la capacité d'origine et la nouvelle capacité. Comme TomTom l'a dit aussi, votre fichier est probablement composé de 8 bits, il sera donc converti en unicode 16 bits en mémoire, ce qui fera doubler sa taille.
Le programme n'a même pas encore rencontré le prochain doublement - qui est StringBuffer.toString()
en Java 6 allouera une nouvelle String
et la char[]
interne seront copiées à nouveau (dans certaines versions antérieures de Java cela n'a pas été le cas). Au moment de cette copie vous aurez besoin de doubler l'espace de tas - donc à ce moment au moins 4 fois la taille réelle de vos fichiers (30MB * 2 pour byte-> unicode, puis 60MB * 2 pour toString() call = 120MB) . Une fois cette méthode terminée, GC nettoiera les classes temporaires.
Si vous ne pouvez pas augmenter l'espace mémoire de votre programme, vous aurez des difficultés. Vous ne pouvez pas prendre la route "facile" et renvoyer simplement un String
. Vous pouvez essayer de le faire de manière incrémentielle afin de ne pas avoir à vous soucier de la taille du fichier (l'une des meilleures solutions). Regardez votre code de service Web dans le client. Il peut fournir un moyen d'utiliser une autre classe que String
- peut-être un java.io.Reader
, java.lang.CharSequence
, ou une interface spéciale, comme le SAX org.xml.sax.InputSource
. Chacun d'entre eux peut être utilisé pour créer une classe d'implémentation qui lit à partir de votre fichier en morceaux, car les appelants en ont besoin au lieu de charger le fichier entier en une seule fois. Par exemple, si vos routes de gestion de service Web peuvent prendre un CharSequence
alors (si elles sont bien écrites), vous pouvez créer un gestionnaire spécial pour renvoyer un seul caractère à la fois du fichier - mais mettre en tampon l'entrée. Voir cette question similaire: How to deal with big strings and limited memory.
Quelle est la taille du fichier? Quels sont les paramètres de votre mémoire JVM -Xms, -Xmx? Des paramètres -XX? – shoover
C'est environ 30MB. Cela pourrait être quelque chose de plus grand que ça. Fondamentalement, ce que j'ai écrit est un client qui consomme un webservice. Le client passe la chaîne en tant qu'argument au service Web. Je n'ai actuellement pas changé mes paramètres JVM. – Deepak