Allocation mémoire

Allocation mémoire - Java - Programmation

Marsh Posté le 20-03-2006 à 10:30:31    

Bonjour,
 
J'ai un problème de libération de mémoire en ce moment sur une appli Java/Struts/Weblogic et je me pose des questions sur le fonctionnement de l'allocation mémoire et de sa libération.
 
Par exemple, que se passe-t-il dans le cas d'une déclaration de tableau de String[] dans une boucle de x occurences ?
A chaque occurence, l'ancienne variable est-elle bien supprimée pour laisser de la place à la nouvelle ? (en gros, le GC fait-il bien son boulot?) Ou y a-t-il un gain réel à sortir l'allocation de la boucle, et réutiliser la même variable à l'intérieur ?
 
Merci d'avance

Reply

Marsh Posté le 20-03-2006 à 10:30:31   

Reply

Marsh Posté le 20-03-2006 à 11:48:33    

Up
 
personne pour m'aider svp ? mes questions sont pas claires peut être ?

Reply

Marsh Posté le 20-03-2006 à 12:50:31    

Que tu écrive
 

Code :
  1. String[] strings;
  2. for (...)
  3. {
  4.     strings = new String[123];
  5. }


 
ou
 

Code :
  1. for (...)
  2. {
  3.     String[] strings = new String[123];
  4. }


 
ne change rien, le tableau est toujours créé dans le boucle. Si tu veux limiter la création d'objets, tu peux sortir l'instanciation du tableau en dehors de la boucle et le reinitialiser en début de chaque itération avec Arrays.fill(strings, null) si nécessaire.


---------------
Commons Configuration - http://jakarta.apache.org/commons/configuration
Reply

Marsh Posté le 20-03-2006 à 12:58:50    

Ok merci c'est bien ce que je pensais.
L'instanciation en dehors de la boucle a un réel intérêt ? Il me semble qu'elle n'en a que si le GC ne fait pas son boulot, il devrait normalement libérer tout comme il faut non ?
 
Par contre au niveau performances, ça améliore peut être...

Reply

Marsh Posté le 20-03-2006 à 14:03:18    

L'instanciation c'est quand tu appelles new. Le fait d'écrire "String strings" ne crée pas d'objet, mais une référence vers un objet. Déclarer la variable en dehors de la boucle n'apporte pas de gain significatif, dans ce cas la portée de la référence étant plus large le dernier objet créé dans ta boucle ne sera pas déréférencés et sera donc potentiellement collecté plus tard par le GC.


---------------
Commons Configuration - http://jakarta.apache.org/commons/configuration
Reply

Marsh Posté le 20-03-2006 à 14:13:09    

Oui oui je parlais bien d'instanciation, dans le sens de faire le new à l'extérieur de la boucle, puis vider ma variable à l'intérieur :)
 
Effectivement j'avais pas pensé à la portée de la variable... ça ne devrait pas poser de problème dans mon cas, mes méthodes étant assez courtes en général, mais je vais garder ce point à l'esprit quand même.
 
Merci :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed