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

Java Discussion :

Une fuite de mémoire ?


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    etudiant / developpeur
    Inscrit en
    Décembre 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : etudiant / developpeur

    Informations forums :
    Inscription : Décembre 2009
    Messages : 131
    Par défaut Une fuite de mémoire ?
    Bonjour je fais actuellement un projet qui tourne sous linux sur une carte raspberry pi.

    lorsque je laisse tourner mon application une journée voir 2 jour j'ai une classe qui me lance une execption lorsque je tente de lire le capteur.

    erreur : /sys/mem too many file open

    c'est la seule classe de capteur pour qui j'ai du faire une librairy .so pour lire ce capteur la, alors je pense qu'il peut y avoir un probleme dans l'appel du code natif (j'utilise JNA).

    donc ma vrai question c'est comment trouver cette fuite de memoire sachan que mon ide ne peux lancer mon appli donc pas de debugger (quel outil puis-je utiliser ou une api de monitoring? bref j'ai besoin d'aide ) .

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Pour commencer, il faudrait savoir si c'est normal d'ouvrir beaucoup de fichiers. Si c'est une classe qui accede à un capteur, on peut supposer que non. Dans ce cas, il faudrait poster les appels à JNA utilisés qui ouvrent un fichier pour voir si ceux-ci sont bien fermés.

    Si tu ne sais pas trop d'ou le probleme peut venir, tu peux lancer la commande "lsof -p PID_Programme" pour voir la liste des fichiers ouverts. Ca te donnera une piste...

  3. #3
    Membre confirmé
    Homme Profil pro
    etudiant / developpeur
    Inscrit en
    Décembre 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : etudiant / developpeur

    Informations forums :
    Inscription : Décembre 2009
    Messages : 131
    Par défaut
    merci de ta reponse,

    Alors non c'est pas normal que mon application ouvre beaucoup de fichier , c'est pour ca que j'ai directement pensé a une fuite memoire, et je pense que cela viens de la classe qui gére le capteur de temperature car lorsque cela survien c'est la seul classe qui ne repond plus et dont le thread ne repond plus.

    je vais recrée l'erreur et faire la commande indiqué pour voir quel fichier sont en cause.

  4. #4
    Membre confirmé
    Homme Profil pro
    etudiant / developpeur
    Inscrit en
    Décembre 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : etudiant / developpeur

    Informations forums :
    Inscription : Décembre 2009
    Messages : 131
    Par défaut
    Alors j'ai testé la commande indiquer mais j'ai un beau command not found, actuellement la version squeezy tourne sur mon pi.

  5. #5
    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
    Je suppose que ton capteur ouvre un fichier dans /dev/ pour lire la valeur et "oublie" de le fermer.
    Le plus simple serait quand même de faire tourner ton application sur un linux de bureau en branchant le même capteur et voir ce que ça donné. Là t'aurais au moins tous les outils de dev


    Et si ta framboise gère /proc, tu peux aussi faire un


  6. #6
    Membre confirmé
    Homme Profil pro
    etudiant / developpeur
    Inscrit en
    Décembre 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : etudiant / developpeur

    Informations forums :
    Inscription : Décembre 2009
    Messages : 131
    Par défaut
    ca doit etre a cout sur le coup du fichier pas fermer apres lecteur tchize, et je pense savoir d'ou ca vient : de la librairie .so que j'ai codé pour lire le capteur.

    je suis debutant en C et je pense que le garbage collector fait relativement bien sont boulot en java.

    ma librairie comporte 3 fonction : une pour lire les valeurs du capteur et les 2 autre pour recuperé les valeurs

    je post la fonction qui doit etre la cause (pour info ma librairie et une librairie dynamic )

    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
    extern "C" int readValue(int pin) {
     
        if (!bcm2835_init())
            return -1;
        int data[100];
        int counter = 0;
        int laststate = HIGH;
        int j = 0;
        int state=0;
        bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_OUTP);
        bcm2835_gpio_write(pin, HIGH);
        usleep(500000); // 500 ms
        bcm2835_gpio_write(pin, LOW);
        usleep(20000);
        bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_INPT);
        data[0] = data[1] = data[2] = data[3] = data[4] = 0;
        temp = hygro = 0;
        while (bcm2835_gpio_lev(pin) == 1) {
            usleep(1);
        }
        for (int i = 0; i < MAXTIMINGS; i++) {
            counter = 0;
            while (bcm2835_gpio_lev(pin) == laststate) {
                counter++;
                if (counter == 1000)
                    break;
            }
            laststate = bcm2835_gpio_lev(pin);
            if (counter == 1000) break;
            if ((i > 3) && (i % 2 == 0)) {
                data[j / 8] <<= 1;
                if (counter > 200)
                    data[j / 8] |= 1;
                j++;
            }
        }
        if ((j >= 39) &&
                (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF))) {
            float f, h;
            h = data[0] * 256 + data[1];
            h /= 10;
            f = (data[2] & 0x7F)* 256 + data[3];
            f /= 10.0;
            if (data[2] & 0x80) f *= -1;
            temp = f;
            hygro = h;
            state =1;
        } else {
            temp = -1;
            hygro = -1;
            state =-1;
        }
        return state;
    }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/03/2012, 18h55
  2. Eviter une fuite mémoire sur un thread
    Par BuzzLeclaire dans le forum Langage
    Réponses: 9
    Dernier message: 03/11/2011, 11h06
  3. Réponses: 18
    Dernier message: 21/01/2009, 15h35
  4. Localiser une fuite mémoire en C++
    Par echecetmat dans le forum Débuter
    Réponses: 2
    Dernier message: 12/11/2008, 16h42
  5. [ATL-COM] Identifier l'origine d'une fuite mémoire
    Par Mat.M dans le forum Visual C++
    Réponses: 5
    Dernier message: 20/06/2007, 19h47

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