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

3D Java Discussion :

[java3d] Textures : outOfMemoryError


Sujet :

3D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut Fuite mémoire :OutOfMemoryError
    Bonjour,

    J'ai un soucis concernant mon logiciel. Celui-ci permet de visualiser en 3D (grâce à java3D) un schéma que l'utilisateur dessine via une zone de dessin
    2D. L'utilisateur peut en fait dessiner des batiments et ensuite visualiser le résultat en 3D.

    Le problème c'est qu'à chaque fois que j'affiche la visu 3D, la mémoire utilisée augmente petit à petit, au bout d'un certain nombre de fois, j'ai l'exception suivante: java.lang.OutOfMemoryError: Java heap space

    A chaque affichage d'une nouvelle visu je tente pourtant de détruire la précédente, mais sans succès....
    Ma visu3D se trouve dans une JInternalFrame.
    Chaque fois je tente de détruire: le branchgroup principal, le canvas, le simpleUniverse, puis la JInternalFrame. Je fais également un System.gc() et un runtime.gc()

    Ps:je ne veux pas augmenter la taille de ma JVM

  2. #2
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Il faut que tu cherches avec un profiler ce qu'il se passe exactement.

    Le profiler de Netbeans m'a bien aidé une fois.
    Sinon tu as TPTP pour Eclipse.

    Ca te permettra de regarder quels objets sont instanciés, combien de fois ils le sont, et si ça diminue pas quand tu penses les libérer c'est que t'as un problème à ce niveau.

    System.gc() "ne sert à rien" (dans le sens où il ne libèrera pas les instances bloquées de toute façon), il ne faut pas l'utiliser en environnement de production, la JVM gère ça très bien toute seule.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    ok, ce fut une tres bonne idée,je le reconnais, mais je l'ai abandonnée...
    Car il faut eclipse 3.2.2 puis EMf.2.3 puis tptp plugin puis.... puis lorsque tu as passé 3h a tout télécharger et installer...ca ne marche toujours pas car tu as un JDK 6 et ca ne convient plus soit disant car un certain JVMPI n'est plus supporté et qu'il faudrait utiliser un JVM TI...Bref c'est une misère pour installer ce plugin...

  4. #4
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Utilise Netbeans alors. Suffit d'installer Netbeans, pas d'importer ton projet dedans, il suffit de fournir un paramètre en ligne de lancement à ton application pour pouvoir y connecter le Profiler de Netbeans.

  5. #5
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Euh... j'utilise JAVA 1.6 et je n'ai aucun problème pour utiliser le plugin TPTP.

    En faisant attention aux différents composants (et à leurs versions) qu'il nécessite, on s'en sort sans problèmes.

    Sinon, il y a JProbe, très efficace pour faire du profiling d'applications java. Le hic, c'est qu'il s'agit un outil professionnel dont la licence est très coûteuse...
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  6. #6
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    Salut, peut -être avec ta config, mais si tu vas sur la page tptp eclipse:
    http://www.eclipse.org/tptp/home/downloads/

    Tu verras ce qui est requis:
    -Java Runtime Environment (JRE) or Java Development Kit (JDK) v1.4

    Moi j'ai une version supérieure et ca me donne:
    FATAL ERROR: JVMPI, an experimental interface, is no longer supported:
    http://forum.java.sun.com/thread.jsp...22548&tstart=0

    Mais tant pis, je vais utiliser netbeans, ca a l'air + simple a installer

  7. #7
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    Ayant reussi a utiliser le profiler de netbeans, J'ai donc remarqué que toute la mémoire était prise par mes textures:
    image.TextureLoader.getTexture()

    Le logiciel est composé de 2 parties:
    -une partie dessin du shéma qui sera représenté en 3D
    -La visualisation 3D

    L'utilisateur switch donc entre les 2 parties. C'est ici qu'intervient le problème. Plus l'utilisateur reconstruit la visu3D, plus la mémoire allouée dans la JVM augmente. Au bout d'un certain nombre de fois j'ai donc l'erreur : outOfmemoryError, qui signifie que le max de mémoire est atteint dans la JVM.

    Grace à un profiler, j'ai remarqué que toute la mémoire était utilisée par:
    image.TextureLoader.getTexture().

    J'ai bien essayé de mettre à null toutes les textures lorsque je switch de la visu3D vers la zone de dessin, mais malheuresement la mémoire augmente toujours...une solution?

    PS: je ne veux pas augmenter la taille mémoire de la JVM

  8. #8
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut Et bien...
    Tu peux essayer d'appeler de manière explicite le garbage collector gc() aprés avoir mis tes textures à null, toutefois sache qu'il ne supprimera pas forcément tout. Le fonctionnement du GC est plutôt compliqué, je dirait presque (car ce n'est pas le cas bien sûr !) aléatoire...

  9. #9
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    Salut ,

    Merci de ta réponse mais j'ai déja essayé cette solution.
    Pour l'instant les 2 seules lignes de codes qui ont agis et qui m'ont fait gagner un peu de mémoire sont:
    Primitive.clearGeometryCache();

    et

    Viewer.clearViewerMap();

    Merci quand même d'avoir participé

  10. #10
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut Re
    Personnellement, je pense qu'à chaque switch, la JVM charge une autre texture.

    J'essaierais de mettre ma texture a null avant un rechargement.

  11. #11
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    Salut javator,

    Voici ce que j'ai écrit dans mon post:

    J'ai bien essayé de mettre à null toutes les textures lorsque je switch de la visu3D vers la zone de dessin, mais malheuresement la mémoire augmente toujours...une solution?
    Voici ce que tu me réponds:
    Personnellement, je pense qu'à chaque switch, la JVM charge une autre texture.

    J'essaierais de mettre ma texture a null avant un rechargement.
    ...Mais merci quand même...

Discussions similaires

  1. [Java3D] Texture : Appliquer plusieurs fois
    Par akito dans le forum 3D
    Réponses: 2
    Dernier message: 21/03/2012, 14h52
  2. java3D, apparence: ma texture ne se montre pas?
    Par corseb-delete dans le forum 3D
    Réponses: 1
    Dernier message: 06/04/2008, 15h30
  3. [Java3D] Textures sur un objet
    Par vero55 dans le forum 3D
    Réponses: 3
    Dernier message: 18/04/2007, 17h53
  4. Réponses: 9
    Dernier message: 04/04/2007, 12h51
  5. [JAVA3D] Comment active-t-on l'alpha sur une texture?
    Par SuperCed dans le forum OpenGL
    Réponses: 3
    Dernier message: 08/06/2005, 10h50

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