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 :

[Avancé][Optimisation] Charger des librairies dynamiquement


Sujet :

Java

  1. #1
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut [Avancé][Optimisation] Charger des librairies dynamiquement
    Hello !

    J'ai un programme java qui tourne en tâche de fond, avec une petite icône dans le tray. Il exécute des tâches de manière périodique, mais de période assez longue (plusieurs jours ou semaines).

    J'aimerais que le programme soit "léger", c'est-à-dire qu'il ne monopolise pas la mémoire vive de l'utilisateur alors qu'il ne fait rien la plupart du temps. Pourtant, il est assez lourd actuellement, car il utilse plusieurs librairies lors du traitement qu'il effectue (compression, encryptage, ftp, etc...).

    Y a-t-il un moyen de ne charger les librairies qu'au moment voulu, et de les "décharger" ensuite ? Car pour juste afficher son icône dans le tray et tourner sans rien faire, il ne prends que la moitié des ressources qu'il utilise actuellement !

    Ca permettrait d'alléger un peu tout ça et d'embêter un peu moins l'utilisateur , surtout ceux qui ont de petites machines avec peu de RAM ... Merci d'avance !

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Salut,

    Regarde du coté de BCEL.
    Cette librairie te permet de gérer ce genre de problème et de faire des chargements de classe dynamiquement !

    K

  3. #3
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Euh autant pour moi j'ai mal compris la question..
    Regarde plutot du coté du package des References : java.lang.ref

    K

  4. #4
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut
    lol je me disais aussi ...

    Je t'avoue que je vois pas vraiment comment faire avec References non plus ...

  5. #5
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    J'ai le temps de donner quelques précisions :

    Avec les "weak references" tu peux créer des objets qui seront plus facilement purgés par les GC.

    Avec BCEL, tu peux instancier une classe au runtime.

    Si je comprend bien ton problème se situe au niveau des librairies, qui prênent beaucoup de mémoire même quand aucun objet les concernant est instancié. Mais ça m'étonne que tu aies des librairies aussi lourdes, qui justifient d'une telle charge mémoire. Peux-tu donner des chiffres ? Ton application en standby, sans objet instancié, occupe-t-elle autant de mémoire au point de devenir gênante pour les utilisateurs ?

    Si ton problème se situe plus au niveau du poids mémoire des objets de ton programme, c'est autre chose, au lieu de les instancier durant toute la durée de vie de ton programme, tu peux uniquement les instancier quand tu en as besoin..

    En espérant que ça aide un peu,
    K

  6. #6
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut
    Merci pour ton intérêt !

    Disons que c'est loin d'être grave : mon application en standby sans aucun objet pèse environ 13 Mo, alors qu'à "pleine charge" elle pèse dans les 26 Mo. Les libraires lourdes sont les libraires graphiques. J'utilise RCP (donc les librairies d'Eclipse, SWT, JFace), et c'est assez conséquent.

    Il me semble que c'est assez loin d'être handicapant, mais je me dis qu'un tray ne devrait normalement "rien" consommer !

  7. #7
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Si tu veux que ton Tray consomme moins, il faut carrément créer une fenêtre vierge lors de l'iconification, et la mettre dans le Tray. Ca aura pour effet que la fenêtre principale ( que tu as normalement instancié dans une classe de type "Controller" ) identifiée par un objet, se voit mise à portée du GC, au profit de ta fenêtre qui ne contient rien.

    Au départ -> Initialisation de ton objet taFenetre en instanciant ta classe FenetreComplete, de type Fenetre.

    Lors de l'iconification -> Réinitialisation de ton objet taFenetre en instanciant ta classe FenetreTray, toujours de type Fenetre, mais étant vide.
    A ce moment, ton objet FenetreComplete existe toujours en mémoire, mais n'est plus référencé par taFenetre, donc le GC s'en occupera.
    Tu peux forcer un GC() lorsque ton Tray est stabilisé.

    Lors de l'agrandissement -> instanciation de la FenetreComplète.

    Ton programme sera plus lent ( car il faudra recréer la fenêtre principale à chaque fois ) mais il consommera moins de mémoire ! Ca devrait marcher

    K

  8. #8
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut
    C'est une bonne idée, mais en fait ce n'est pas comme ça que fonctionne mon soft !

    Mon soft permet de faire du backup de données. L'utilisateur programme le soft pour qu'il le fasse périodiquement (tous les jours, toutes les semaines, etc...) mais peut aussi le faire manuellement (en cliquant sur un bouton).

    En gros j'ai un service qui se lance au démarrage et qui met une icône dans le tray "pour montrer qu'il est là" (et aussi donner 2-3 infos à l'utilisateur sur ce qu'il fait, genre début du traitement, etc...). Ce service s'occupe du traitement périodique. J'ai ensuite séparément ma "grosse" application, avec fenêtres et tout le reste, où l'utilisateur peut définir ses settings, choisir ce qu'il veut backuper, faire un restore, etc...).

    Les deux (service et application) utilisent donc une même base, qui se trouvent dans le projet lié à l'application. Comme je bosse avec Eclipse, j'ai simplement ajouté le projet de l'application au build path du projet du service/tray pour avoir accès à tout.

    Donc c'est pour ça que je pense qu'il charge un peu tout ce que la grosse application utilise ...

  9. #9
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Si j'ai bien compris, tu as 3 projets sous Eclipse, dont un qui est associé aux autres car il permet l'accès aux données.
    C'est ce projet donc qui utilise beaucoup de mémoire : les librairies sont volumineuses à ce point ? Tu utilises au minimum un driver JDBC, ça ne devrait pas être si couteux que ça si ?

    Enfin bon je pense que finalement il va falloir que tu crées un projet d'accès aux données spécial pour ton Tray, qui n'autorise que l'accès aux données dont tu as besoin, de la manière la plus simple.

    Bon courage ,
    K

  10. #10
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut
    Mouais ...

    Je pense que je vais devoir m'y résoudre... En tous cas merci pour ton intérêt ! Ca fait plaisir de voir qu'on est pas seul dans l'adversité !

  11. #11
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Le fait de tenter d'aider les autres, permet aussi de comprendre certaines choses soi-même
    Je préfère utiliser mon temps libre à aider les autres, tout en sachant que ça permet de consolider mes connaissances, plutôt qu'à jouer au démineur

    a+,
    K

  12. #12
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut
    Très bonne philosophie. C'est vrai que c'est en expliquant à quelqu'un qu'on se rend vraiment compte si l'on a compris ou pas !

  13. #13
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Non seulement ça : apprendre quelque chose implique un travail presque mécanique : le fait de faire fonctionner un réseau de neurones plusieurs fois permet de "l'entrainer" et donc de rendre son cerveau plus efficace dans le domaine concerné, et moi j'ai tout interet à devenir le plus performant possible en programmation

    On ne peut pas pretendre savoir quelque chose, si on ne l'a abordé qu'une fois, sauf si cette chose qu'on cherche à apprendre se met en relation avec autre chose qu'on sait déjà !

    Vive le cerveau ! Une énorme imbrication de fleuves chimiques constamment immergés par le liquide du savoir et parcouru par d'innombrables rayons d'electricité, qui parfois deviennent "des éclairs de génie"

    K

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

Discussions similaires

  1. Problème pour charger des font dynamiquement et les utiliser (marche à moitié)
    Par rigolman dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 31/03/2009, 08h29
  2. quid des librairies dynamiques
    Par Garulfo dans le forum Caml
    Réponses: 12
    Dernier message: 17/06/2008, 13h11
  3. Charger des librairies à partir d'un répertoire
    Par Aragorn05 dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 20/02/2008, 15h14
  4. Charger une librairie dynamique
    Par mrfirefunk dans le forum Applets
    Réponses: 1
    Dernier message: 27/11/2007, 09h36
  5. Réponses: 2
    Dernier message: 13/03/2007, 17h07

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