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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    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 expérimenté
    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
    Par défaut
    tu peux déjà fermer tes statement et voir ce que ça donne

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    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.

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    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 confirmé 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 : 54
    Localisation : France, Ille et Vilaine (Bretagne)

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

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

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 confirmé 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 : 54
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 129
    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 ??

+ 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