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

Servlets/JSP Java Discussion :

Java heap space Exception, problème de mémoire


Sujet :

Servlets/JSP Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut Java heap space Exception, problème de mémoire
    Bonjour,

    je travail avec Tomcat 5.5, Java et JSP.
    J'ai une page JSP contenant une table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <h:dataTable id="logDetails" var="item"
        value="#{logDetails.items}" styleClass="standardTable"
        headerClass="standardTable_Header"
        footerClass="standardTable_Header"
        rowClasses="standardTable_Row1,standardTable_Row2"
        columnClasses="standardTable_Column,standardTable_Column,standardTable_ColumnCentered,standardTable_ColumnCentered,standardTable_ColumnCentered,standardTable_Column">
        <h:column>
            <f:facet name="header">
                <h:outputText value="Time" />
            </f:facet>
            <h:outputText value="#{item.CreationTime}" style="font-size: 10px" >
                <f:convertDateTime pattern="HH:mm:ss" />
            </h:outputText>
        </h:column>
    .......
    Cette table est "remplie" avec son bean Java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public Vector getItems() throws SQLException
    {
        Connection connection = DBHelper.getDBConnection();
        try
        {
            PreparedStatement stmt = connection.prepareStatement(SQL_SELECT_LOG_DETAILS);
            stmt.setString(1, sessionID);
            ResultSet rs = stmt.executeQuery();
            return ResultSupport.toVector(rs);
        }
        finally
        {
            connection.close();
        }
    }
    et ma fonction Java, toVector:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public static Vector toVector(ResultSet rs) throws SQLException
    {
        ResultSetMetaData rsmd = rs.getMetaData();
        int noOfColumns = rsmd.getColumnCount();
        String[] columnNames = new String[noOfColumns];
        for (int i = 1; i <= noOfColumns; i++)
        {
            columnNames[i-1] = rsmd.getColumnName(i);
        }
        Vector result = new Vector();
        while (rs.next())
        {
            SortedMap<String, Object> columnMap = new TreeMap<String, Object>(String.CASE_INSENSITIVE_ORDER);
            for (int i = 0; i < noOfColumns; i++)
            {
                Object value = null;  
                if (rsmd.getColumnType(i) == Types.CLOB)
                {
                    value = rs.getString(i); // workaround for TEXT datatype
                }
                else
                {
                    value = rs.getObject(i);
                }
                if (rs.wasNull())
                {
                    value = null;
                }
                columnMap.put(columnNames[i-1], value);
            }
            result.add(columnMap);
        }
        return result;
    }
    Pour accéder à cette page j'ai un lien depuis une autre page. J'ai remarqué que chaque fois que je clique sur ce lien, la mémoire utilisé pas Tomcat (gestionnaire de taches) augment à chaque fois, elle ne rédiminue plus quand je change de page. Je crois que c'est ça la cause mon problème.
    Si je clique sur ce lien plusieurs fois (genre utilisateur stressé qui veut vite ouvrir et qui ne sais pas que cliquer plusieurs fois ne sert à rien ) et que la table est grosse (~60 lignes) j'ai une erreur de "Java heap space".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    javax.servlet.ServletException: Java heap space
        javax.faces.webapp.FacesServlet.service(FacesServlet.java:125)
        org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:112)
     
    javax.faces.FacesException: Java heap space
     
    org.apache.jasper.JasperException: Java heap space
     
    javax.servlet.ServletException: Java heap space
     
    java.lang.OutOfMemoryError: Java heap space
    à partir de ce moment la, je ne peux presque plus rien ouvrir de mon site web, j'ai toujours cette erreur. A part des toutes petites tables (2lignes).

    J'ai remarqué que si j'ouvre des pages contenant des tables plus petites (~40 lignes), j'ai une autre erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    javax.servlet.ServletException: org.apache.jasper.JasperException
        javax.faces.webapp.FacesServlet.service(FacesServlet.java:125)
        org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:112)
     
    javax.faces.FacesException: org.apache.jasper.JasperException
     
    org.apache.jasper.JasperException
     
    java.lang.ArrayIndexOutOfBoundsException
    Je peux vous donner la trace complète de la cause mère de cette erreur, si nécessaire. Et d'autres parties de code?

    Ma question est: comment gérer ça? Comment éviter l'erreur, ou au moins éviter de devoir redémarrer Tomcat si cela arrive??

    Je ne veux pas augmenter la taille de la mémoire alloué, en cas normal c'est suffisant...et le mieux serais que la mémoire utilisé par Tomcat n'augmente sans cesse...

    J'espère que quelqu'un ici puisse m'éclairer un peut...

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2007
    Messages : 197
    Points : 246
    Points
    246
    Par défaut
    tu peux déjà fermer tes statement et voir ce que ça donne

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Et plus généralement la connexion aussi: http://java.developpez.com/faq/jdbc/...etureStatement

    Et puis tant que tu y es tu pourras fermer le resultset que ça ne ferait aucun mal.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    Merci pour les réponses! Je suis en train de reprendre le code pour tout fermer et voir la différence, mais il me faudra un moment...

    J'ai encore une question: quand on fais des on dois fermer aussi le PreparedStatement, après?

    merci

  5. #5
    Membre habitué Avatar de Altenide
    Homme Profil pro
    Formateur en technologies web
    Inscrit en
    Décembre 2008
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Formateur en technologies web
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2008
    Messages : 129
    Points : 182
    Points
    182
    Par défaut
    non, on ferme le Resulset, la connexion et le Statement.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui

    et eviter de faire une conneexion systématique dans ton getter. JSF va appeler plusieurs fois le get pour faire un seul affichage, donc si tu va chercher dans la DB à chaque fois, ça peux vite être lourd.

  7. #7
    Membre habitué Avatar de Altenide
    Homme Profil pro
    Formateur en technologies web
    Inscrit en
    Décembre 2008
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Formateur en technologies web
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2008
    Messages : 129
    Points : 182
    Points
    182
    Par défaut
    une question dans le sujet, lorsque l'on ferme le Statement çà ne ferme pas le prépare PreparedStatement du même coup ??

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    Merci tchize_ !

    Mais, comment faire pour ne pas mettre ma connexion dans le getter? J'imagine que je devrais l'ouvrir au chargement de la page et la fermer à la fermeture de la page... est-ce qu'il y a une exemple quelque part? (je ne trouve pas)

    Ou simplement avec un if sur mon ResultSupport (not null) ??

    Ensuite, si j'ai bien compris, l'interface PreparedStatement étend Statement. C'est donc la "même chose", je ne comprend pas la question de Altenide...
    je pense que ou on utilise un, ou l'autre. Juste?

    Moi j'utilise des PreparedStatement partout...car très souvent j'ai des paramètres variables dans ma query (avec des ?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PreparedStatement stmt = connection.prepareStatement(SQL_SELECT_LOG_DETAILS);
    stmt.setString(1, sessionID);
    Est-ce que la solution d'utiliser des PreparedStatement est la meilleure? Même si j'en ai plusieurs dans une même fonction? Ou dans certains cas c'est mieux de créer un seul Statement (mais plusieurs query ) ?

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    stocker le résultat après le premier appel, tout simplement. Et mettre le bean en question en request scope.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    Désolée mais je crois qu'il me manque une petite case pour comprendre ta dernière réponse

    Mon bean est déjà en request scope.

    Si je comprend bien, je dois stocker mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResultSupport.toVector(rs)
    dans une variable globale (ex. monItems). et faire simplement dans le getter.

    Mais dans quelle partie du code dois-je implémenter la connexion avec le select pour que se soit exécutée uniquement une première fois?
    Si je crée un constructeur de mon bean, lui, il est appelé implicitement uniquement au chargement de la page?

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    au meme endroit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (monitem==null) {
       // récupérer monitem de la db
    }
    return monitem;

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    ok

    Merci!!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de mémoire: Java heap space
    Par Benduroy dans le forum Général Java
    Réponses: 3
    Dernier message: 20/05/2011, 15h14
  2. Réponses: 10
    Dernier message: 25/08/2010, 21h07
  3. Problème mémoire Java heap space avec tableau et ArrayList
    Par phoenix420 dans le forum Collection et Stream
    Réponses: 45
    Dernier message: 22/06/2010, 10h01
  4. Exception JAVA HEAP SPACE
    Par JauB dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 06/08/2007, 10h51
  5. probleme de mémoire : Java heap space
    Par Seb33300 dans le forum Interfaces Graphiques en Java
    Réponses: 10
    Dernier message: 21/02/2007, 13h40

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