Je ne suis pas expert Java.
Mon code lit un fichier dans une chaîne Je suis hors de la mémoire, après quelques jours. P> La question que j'ai est, lorsque mes codes sortent de la portée de la Je suis assez confus en lisant sur Internet. Certaines personnes disent qu'il n'est pas supprimé et utilise code>. Ce code est exécuté toutes les 5 minutes.
La taille du fichier varie. Parfois, il est parfois 100, il est parfois 1000 lignes. P>
Fonction de fichier de lecture code>, Java Portbage ramasse la chaîne? P>
stringbuffer code>. P>
5 Réponses :
Bonjour, je ne suis pas expert Java. P> blockQuote>
Tout le monde a quelque chose qu'ils peuvent apprendre. p>
Mon code lit un fichier dans une chaîne, ce code est exécuté toutes les 5 minutes. Maintenant, une taille de fichier de 100 lignes parfois 1000 lignes. P> blockQuote>
ne semble pas très grand ou très souvent. Ne devrait pas être un problème. P>
Je suis hors de la mémoire, après quelques jours. P> blockQuote>
Vous devriez pouvoir obtenir un vidage de tas et voir où vous êtes à court de mémoire et pourquoi. P>
question que j'ai est, lorsque mes codes sont hors de portée de la fonction de fichier de lecture. La poubelle Java ramasse-t-elle la chaîne? P> blockQuote>
Il peut être collecté quand il n'est plus accessible via une référence forte. P>
Je suis assez confus en lisant sur Internet Certains dit qu'il n'est pas supprimé et utiliser Stringbuffer P> blockQuote>
On dirait que vous êtes venu au bon endroit. Je n'ai jamais entendu cette question. P>
Votre méthode code> lue code> ne terminera jamais. Une fois que vous avez atteint la fin du fichier, vous continuez simplement d'ajouter la chaîne Edit: oubliez que, "nullabcd" code> à
s code>, pour toujours. P>
s code> est ré-attribué à chaque fois. Néanmoins, je ne peux pas voir comment votre
lue code> peut terminer. P>
Oui, j'ai un fort sentiment que le code posté n'est pas le code réel qui a des problèmes.
changer le programme comme ci-dessous pour consommer moins de mémoire. Une énorme source de consommation de mémoire est due à votre concaténation à chaîne répétée de s + = "ABCD"; code> - Évitez cela et vous aurez probablement plus de réduire de moitié votre consommation de mémoire (non testée - profiler vous-même si Vous voulez savoir).
public static void read(BufferedReader br) throws Exception {
long length = 0;
//String s; <--- change to the line below
StringBuilder sb = new StringBuilder();
while (true) {
String s = br.readLine();
if (s == null) {
break;
}
//s += "abcd"; <--- change to the line below
sb.append(s).append("abcd");
length += s.length();
//System.out.println(s);
}
System.out.println("Read: " + (length / 1024 / 1024) + " MB");
}
Le code que vous avez affiché ne fuit pas la mémoire. Cependant, la boucle Ce code ne fuit pas non plus que les chaînes créées dans la méthode seront toutes des candidats à la collecte des ordures Lorsque la méthode revient (si non auparavant). p> Chaque fois que nous exécutons Cependant, il est une bonne raison de créer un Cette version réaffectera le tableau de caractères interne de StringBuilder au plus em> Résumé - Utilisation Le StringBuilder est une bonne idée, mais pas à cause des fuites de mémoire. Si vous avez une fuite de mémoire, il n'est pas dans le code d'exemples d'origine ni dans la version fixe. P> p> tandis que (true) code> ne sera jamais terminée car
s code> ne sera jamais
null code> au point que vous le testez.
< p> permet de changer un peu pour le faire "travailler" p> s + = ss; code> Une nouvelle chaîne est créée composée de tous les caractères actuellement en
S code> et les caractères dans
ss code>. En supposant qu'il y ait n lignes contenant une moyenne de caractères L, le
s + = SS; code> sera appelé n Times, créera n chaînes et copiera en moyenne
(n * l) ^ 2/2 code> caractères. p>
stringbuilder CODE> et c'est pour réduire la quantité d'allocation de chaîne et de copie de caractères qui va au. Permet de réécrire la méthode d'utiliser un
stringbuilder code>; c'est-à-dire un remplacement de
Stringbuffer code> qui n'est pas synchronisé. p>
log2 (n) code> fois et copiez au plus em>
2 * n * l code> caractères. p>
Comme indiqué par d'autres, ce code ne se termine jamais. Il semble que le code que vous avez posté n'est pas le code d'origine que vous rencontrez des problèmes. P>
Difficile à diagnostiquer sans voir le code réel, mais les chaînes seront définitivement percubinées une fois qu'ils ne sont pas référencés à partir d'autres parties du code. P>
Wild Guess: appelez-vous ferme () code> sur vos lecteurs et vos intrigions une fois que vous avez terminé avec eux? Sinon, cela pourrait être la cause de vos erreurs de mémoire de mémoire. P>
Ça dépend. Les chaînes sont des objets. Avec des objets, cela dépend si l'objet est référencé par n'importe quoi (par exemple la valeur de retour de la méthode). Pouvez-vous poster du code?
Serait bien de voir le code et de ce que vous faites avec les cordes que vous avez lues. Essayez de nous donner un SSCCE < / a>
Je ne vois pas comment le code que vous avez posté pourrait courir pendant des jours.
La variable
s code> n'est jamais nulle où il le vérifie depuis qu'il ajoute "ABCD" à celui-ci. Je pensais que cela lancerait une exception mais apparemment, il se transforme en "nullabcd"
@Anonymoose: Je ne vois pas comment ça ne pouvait pas courir indéfiniment :)