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

avec Java Discussion :

out of memory


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 61
    Points
    61
    Par défaut out of memory
    Bonjour

    je suis désolé si ce probleme il à été déjà exposé mais je n'ai rien trouvé d'efficace sur le net

    en faite j'ai une méthode toute simple qui lie des données apartir d'une base de données Mysql (une table de 10 champs max), et dans le main j'appel cette méthode dans un timer toutes les 10 milli seconde

    jusqu'au là tous marche bien j'arrive a lire mes données mais aubout de 4 minute maximum j'ai un out of memory

    sachant que j'ai déja essayé avec 2000 milli seconde et j'ai toujours le même problème (sauf que ça dure plus longtemps)

    j'ai lue sur le net que le driver de Mysql il récupère tous les données en mémoire et c'est ça qui pose problème ? et il parle de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stmt.setfetchsize(Integer.Min_Value)
    j'ai essayé ça et pareil le même problème

    donc si vous avez des idées n'hésité pas

    merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Fait voir ton code...

    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    Hello,

    Il est normal que l'application Java recupere les données de ta base en memoire (puisque cette application creer des Objects Java)

    Sans voir ton programme il est difficile de te donner une reponse precise mais a mon avis tu dois laisser des connections a ta base ouverte donc tu ne liberes pas tes objets.

    1- quelle type d'application utilises tu? (JavaEE/Web/EJB? JavaSE? )

    2- Comment accedes tu a ta base? JDBC Direct? Hibernate ou autre ORM?

    3- Verifies que tu fermes bien tes connexions

    Tu peux nous coller du code pour nous aider.



    Tu peux egalement tuner et profiler ta JVM avec des outils comme JProfiler, JVMStats (http://java.sun.com/performance/jvmstat/ ) ou autre... Profiler une VM, chercher les fuites memoires ne sont pas des operations simples mais tres utiles.


    Kenavo
    Tug
    http://www.exoplatform.org
    http://www.nantesjug.org
    http://www.grallandco.com

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 61
    Points
    61
    Par défaut
    désoler de prendre bcp de temps pour répondre

    voici je pause la partie de mon code qui déclanche l'erreur

    - dans le main j'ai un timer qui à chaque 10 millie seconde il appelle
    6 fois la méthode API_Mobile_MAJ_SQL_vers_API(int X,int Y) qui execute une requete sur la base de données pour récupérer des informations
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    public class testjava {
     
     
    	static DatagramSocket socketReceive1 = null,socketReceive2 = null,socketReceive3 = null;
     
     
     
    	static String url = "jdbc:mysql://172.16.80.58:3306/magmatic";// URL de connexion
    	static String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
    	static SGBD db = new SGBD(driver);
    	static Connection con = null;
    	//private static ResultSet rs = null;
    	static Locale locale = Locale.getDefault();
     
     
    	//Constructeur pour connexion a la base de données
    	public testjava(){
    		con = db.open(url, "root", "admcira");
    	}
     
    public static void main(String[] args){
     
    testjava  T1 = new testjava();
     
    	int delay = 0;
    	int period = 10;
    	 Timer timer = new Timer();
     
    	    timer.scheduleAtFixedRate(new TimerTask() {
    	    	public void run() {
    	    		//try {	
    	    		API_Mobile_MAJ_SQL_vers_API(1,1);
     
    	    		API_Mobile_MAJ_SQL_vers_API(1,2);
     
    	    		API_Mobile_MAJ_SQL_vers_API(1,3);
     
    	    		API_Mobile_MAJ_SQL_vers_API(1,4);
     
    	    		API_Mobile_MAJ_SQL_vers_API(2,1);
     
    	    		API_Mobile_MAJ_SQL_vers_API(2,2);
     
    		}
    	    }, delay, period);	
    }
    la methode API_Mobile_MAJ_SQL_vers_API

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    public static void API_Mobile_MAJ_SQL_vers_API(int z_i_Mobile_Type, int z_i_Mobile_Id){
     
    	String sql = "select * from " + Declaration_Variable.SQL_API_Mobile_Table + " where id = " + z_i_Mobile_Id +" AND cfg_Type = " + z_i_Mobile_Type;
     
     
     
    	try {
    		// ResultSet UPDATABLE ce qui n'est pas le cas par defaut
    		Statement stmt = null;
    		ResultSet zz_rs = null;
     
    		stmt = con.createStatement(zz_rs.TYPE_SCROLL_INSENSITIVE,zz_rs.CONCUR_UPDATABLE);
    //		stmt.setFetchSize(1);
    //		System.out.println(stmt.getFetchSize());
    		if(sql.startsWith("S") || sql.startsWith("s")){ // verification de requette Select 
    			zz_rs = stmt.executeQuery(sql);
    			while(zz_rs.next()){
    				System.out.println(zz_rs.getInt("Id"));
     
    				typ_Mobile zz_Mobile = new typ_Mobile();
     
     
    				try {
    					    //if (db.RecordCount(zz_rs) == 1){
    					    		zz_Mobile.Who.Id = zz_rs.getInt("Id");
    								zz_Mobile.Who.Type = zz_rs.getInt("cfg_Type");
    								zz_Mobile.Who.Name = zz_rs.getString("cfg_Name");
    								//zz_Mobile.Who.Description = rs.getString("cfg_Description");
    								zz_Mobile.ST.Etat = zz_rs.getInt("st_Etat");
    								zz_Mobile.ST.Occupe = zz_rs.getInt("st_Occ");
    								zz_Mobile.ST.Charge = zz_rs.getInt("st_Charge");
    								zz_Mobile.ST.Reserve = zz_rs.getInt("st_Reserve");
    								zz_Mobile.ST.FLT = zz_rs.getInt("st_Flt");
    								zz_Mobile.ST.Echange = zz_rs.getInt("st_Echange");
    								zz_Mobile.Fct = zz_rs.getInt("st_Fct");
    								zz_Mobile.Cde.Type = zz_rs.getInt("st_Fct_Type");
    								zz_Mobile.Cde.M3.Id = zz_rs.getInt("M3");
    								zz_Mobile.Cde.M2.Id = zz_rs.getInt("M2");
    								zz_Mobile.Cde.Utile_Necessaire = zz_rs.getInt("M2_Utile_Necessaire");
    								zz_Mobile.Cde.Ordre = zz_rs.getInt("M2_Ordre");
    								zz_Mobile.Cde.Origine_Id = zz_rs.getInt("Origine_Id");
    								zz_Mobile.Cde.Destination_Id = zz_rs.getInt("Destination_Id");
    								zz_Mobile.Cde.Origine.AxeAna.X = zz_rs.getInt("Origine_X");
    								zz_Mobile.Cde.Origine.AxeAna.Y = zz_rs.getInt("Origine_Y");
    								zz_Mobile.Cde.Origine.AxeAna.Z = zz_rs.getInt("Origine_Z");
    								zz_Mobile.Cde.Destination.AxeAna.X = zz_rs.getInt("Destination_X");
    								zz_Mobile.Cde.Destination.AxeAna.Y = zz_rs.getInt("Destination_Y");
    								zz_Mobile.Cde.Destination.AxeAna.Z = zz_rs.getInt("Destination_Z");
    								zz_Mobile.Cde.Sens = zz_rs.getInt("Sens");
    								zz_Mobile.Pos.AxeAna.X = zz_rs.getInt("Pos_X");
    								zz_Mobile.Pos.AxeAna.Y = zz_rs.getInt("Pos_Y");
    								zz_Mobile.Pos.AxeAna.Z = zz_rs.getInt("Pos_Z");
    								zz_Mobile.Pos.Rail_Id.Id = zz_rs.getInt("Pos_Rail_Id");
    								zz_Mobile.Pos.ssRail_Id.Id = zz_rs.getInt("Pos_ssRail_Id");
    								zz_Mobile.Vit.Cfg.X = zz_rs.getInt("cfg_Vit_X");
    								zz_Mobile.Vit.Cfg.Y = zz_rs.getInt("cfg_Vit_Y");
    								zz_Mobile.Vit.Cfg.Z = zz_rs.getInt("cfg_Vit_Z");
    								zz_Mobile.Mvt.Mvt_Sens.X = zz_rs.getInt("Sens_X");
    								zz_Mobile.Mvt.Mvt_Sens.Y = zz_rs.getInt("Sens_Y");
    								zz_Mobile.Mvt.Mvt_Sens.Z = zz_rs.getInt("Sens_Z");
     
    					   // }
    					    //System.out.println("API_Mobile_MAJ_SQL_vers_API   Mobile_Type : " + z_i_Mobile_Type + "         Mobil_ID : " + z_i_Mobile_Id );
    					    zz_rs.close();
    				} catch (SQLException e) {
    					// TODO Auto-generated catch block
    					//System.out.println("ERROR --> API_Mobile_MAJ_SQL_vers_API   Mobile_Type : " + z_i_Mobile_Type + "         Mobil_ID : " + z_i_Mobile_Id );
    					e.printStackTrace();
     
    				}
    			}
    		}else
    			stmt.executeUpdate(sql);
     
     
    		stmt.close();
    		zz_rs.close();
    	} catch (SQLException e) {
     
    	}
     
     
     
    }
    voila j'éspere que ça va vous aidé.
    merci

  5. #5
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    pourrais-tu remplacer ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     catch (SQLException e) {
     
    	}
    par ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     catch (SQLException e) {
        e.printStacktrace();		
    	}
    Il y a-t-il quelque chose de particulier dans ta classe typ_Mobile (genre auto référencement quelque part).

    Enfin, a vu du code, tu serais pas occupé de travailler sur une java mobile edition?

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Quelques remarques sur ton code :
    • Les attributs static doivent être accédé via le nom de la classe et non pas via une instance
    • Evites les bloc catch() vide : tu dois y conserver au minimum un printStackTrace() !
    • Utilises des try/finally pour fermer correctement ton statement et ton resultset !
      Comment libérer proprement les ressources (ou comment utiliser proprement les bloc try/finally) ?
    • Que vient faire ici la recherche du "S" pour vérifier s'il s'agit d'un select et non pas d'un update ??? le code SQL est en dur dans le code et ne peut pas changer
    • Pas très joli les "_" dans les noms de variables locales et de classes
    • Tout comme l'accès direct aux attributs sans accesseurs/mutateur



    Scénario possible : un exception est masqué par le catch vide, et empêche la libération des ressources... ce qui fait qu'elle s'accumule sans fin...


    La structure de ta méthode devrait plutôt ressembler à ceci :
    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
    try {
     
    	Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    			ResultSet.CONCUR_UPDATABLE);
    	try {
    		String sql = "select ...";
    		ResultSet rs = stmt.executeQuery(sql);
    		try {
     
    			// Traitement du ResultSet
     
    		} finally {
    			rs.close();
    		}
    	} finally {
    		stmt.close();
    	}
     
    } catch (SQLException e) {
    	e.printStackTrace();
    }

    Maintenant il y a un dernier point que je ne comprend pas : à quoi cela peut-il bien servir puisque tu n'utilises pas l'objet "Mobile" que tu crées !


    a++

Discussions similaires

  1. [XStream][String]out of memory
    Par Invité dans le forum Persistance des données
    Réponses: 8
    Dernier message: 10/01/2006, 14h52
  2. [C++] [gcc] out of memory
    Par fxp17 dans le forum GCC
    Réponses: 5
    Dernier message: 06/01/2006, 10h29
  3. [pb mémoire] out of memory d'eclipse
    Par Casp dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/05/2005, 16h39
  4. Out of memory
    Par shurato dans le forum ANT
    Réponses: 1
    Dernier message: 10/11/2004, 16h19
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

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