IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Erreur : OutOfMemoryError


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 75
    Par défaut Erreur : OutOfMemoryError
    Bonjour,

    J'ai un souci dans mon application car lorsque je compile un certain nombre de fois j'ai un message du type java.lang.OutOfMemeryError.

    Au lieu de réallouer de la mémoire j'aimerai savoir d'ou vien le problème.

    Je pense que c'est à cause de la déclration d'un tableau.

    Dans ma classe je déclare un tableau ( variable globale) du type
    static String sTab[][][] = new String [50][500][50];

    puis j'ai une fonction qui lit un fichier et qui appelle un fonction qui traite les lignes de ce fichier.

    Dans cette fonction j'affecte de valeurs à mon tableau.

    Ce que je ne comprend pas c'est que lorsue j'ai lut tout mon fichier je réinitialise mon tableau comme ceci :

    sTab = new String [50][500][50];

    Ce que je fait est-il correct ?

    Ou alors mon problème viens-il d'ailleur ?

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Pour réinitialiser ton tableau, tu devrais plutôt faire un:
    "sTab = null;" => cela indique clairement au ramasse-miettes qu'il peut détruire l'objet pour récupérer sa mémoire.
    Tu ne réinstancieras ton tableau que lorsque tu en auras besoin.

    Ensuite, si tu ne fais que de la lecture de données dans ton fichiers, et que tu as plusieurs chaînes de caractères identiques (ce qui est certainement le cas vu le volume des données), tu devrais appeler la méthode "intern()" sur tes String avant de les stocker dans ton tableau. Tu gagnerais énormément de place en occupation mémoire (j'ai déjà résolu ainsi une problématique similaire)
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 75
    Par défaut
    en fait dans ma fonction de traitement de ligne je récupère des informations que je stock dans mon tableau puis lorsque cela marchera comme il faut (car pour le moment je rencontre pas mal de problèmes liés à mes indices de chaine (je travaille avec charAt et indexOf) et de tableau cla galère ^^.

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Tu as vraiment besoin d'un tableau à 3 dimensions de cette taille?

    Ton tableau fait 50 * 50 * 500 soit 1250000 de chaînes de caractères...
    Donc:

    1) il n'est pas étonnant que tu aies un OutOfMemory (le méthode "intern()" que je t'ai proposée ci-dessus devrait grandement t'aider: elle te permet d'utiliser le même objet pour les chaînes de caractères identiques, et donc d'éviter de dupliquer inutilement des données volumineuses en mémoire)

    2) tu as certainement un problème de conception à la base de ton application...
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  5. #5
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    Lorsque tu fais un sTab = new String[50][500][50], un nouvel espace mémoire est alloué. L'autre espace n'a plus de référence, mais le temps que le gc passe derrière, l'espace mémoire. Avant de ré-initialiser ton tableau, fais un sTab = null. Tu peux explicitement appeler le gc par Runtime.getRuntime().gc(), mais cette méthode n'est à utiliser que dans les cas critiques.

    A toi de voir si tu as vraiment besoin de stocker autant de chaînes de caractères. Si tu sur-dimensionnes ton tableau pour être sûr d'avoir assez de place, cela alloue quand même de l'espace mémoire même si ton tableau est vide. Utilise plutôt des collections dynamiques comme des ArrayList.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 75
    Par défaut
    ben en fait dans les fichier que je lis il y en a qui font + de 2000 lignes et dans mon tableau va contenir certaines parties de ces lignes.


    Il est clair que j'aurais des chaines qui seront identiques mais ce que je veut c'est stocker dans mon tableau chacune des information des lignes qui correspondent à certaines critères donc en fait chaque nouvelle ligne qui correspond à ce que je recherche dans mon fichier va être affecté une nouvelle ligne de mon tableau.

    Moi et les tableaux ca n'à jamais été mon fort et je galère ^^

    Et dire qu'une fois que j'aurais tout bien rangé dans mon tableau va falloir l'afficher ... bon c'est moins chiant ca c'est clair :p.

    Sinon je ne sais pas si avec une ArrayList ca pourrais marcher.

Discussions similaires

  1. Erreur "OutOfMemoryError"
    Par Asma.md2002 dans le forum Débuter
    Réponses: 6
    Dernier message: 11/05/2014, 21h39
  2. Réponses: 0
    Dernier message: 26/12/2012, 18h48
  3. Erreur "OutOfMemoryError: Java heap space"
    Par mouss4rs dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 06/03/2012, 19h31
  4. Réponses: 3
    Dernier message: 04/12/2007, 22h32
  5. Eclipse erreur : java.lang.OutOfMemoryError: Java heap space
    Par sderecourt dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 14/04/2006, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo