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

ANT Java Discussion :

PermGen et SWF


Sujet :

ANT Java

  1. #1
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    Par défaut PermGen et SWF
    Bonjour,

    J'ai une tâche ANT qui est censé compilé un certain nombre important de module FLEX (environ 150). Le script fonctionne super bien. Malheureusement après une quarantaine de compilation je tombe sur la fameuse PermGen spaec erreur.

    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
    Loading configuration file C:\Program Files\Adobe\Flex Builder 3 Plug-in\sdks\3.4.0\frameworks\flex-config.xml
    Error: PermGen space
     
    java.lang.OutOfMemoryError: PermGen space
            at java.lang.ClassLoader.defineClass1(Native Method)
            at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
            at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
            at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
            at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
            at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
            at flex2.compiler.swc.catalog.CatalogReader$LibraryReader.readElement(CatalogReader.java:295)
            at flex2.compiler.swc.catalog.CatalogHandler.startElement(CatalogHandler.java:42)
            at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
            at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
            at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
            at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
            at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
            at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
            at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
            at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
            at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
            at javax.xml.parsers.SAXParser.parse(SAXParser.java:198)
            at flex2.compiler.swc.catalog.CatalogReader.read(CatalogReader.java:89)
            at flex2.compiler.swc.Swc.read(Swc.java:428)
            at flex2.compiler.swc.Swc.<init>(Swc.java:91)
            at flex2.compiler.swc.SwcCache.getSwc(SwcCache.java:224)
            at flex2.compiler.swc.SwcCache.getSwcs(SwcCache.java:190)
            at flex2.compiler.swc.SwcCache.getSwcGroup(SwcCache.java:86)
            at flex2.compiler.swc.SwcCache.getSwcGroup(SwcCache.java:75)
            at flex2.compiler.CompilerSwcContext.load(CompilerSwcContext.java:81)
            at flex2.tools.Compiler.mxmlc(Compiler.java:147)
    Donc J'ai bien ajouté les valeurs suivantes à MAVEN_OPTS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -DXmx=1024m -DXms=1024m -DXX:MaxPermSize=786m
    Avec et sans le D avant le -. le souci est que j'ai l'impression que mon paramètre n'est pas pris en compte car je plante toujours au alentour du même swf à compiler.

    L'idée serait de découper ma compilation en plusieurs build et de pouvoir vider la Permgen entre chaque lancement de build. Je lance les targets ANT à partir de MAVEN. Pour mes tests, j'ai enlevé la partie MAVEN pour être sur que cela ne venait de là mon souci.

    Donc la solution serait un truc du genre :
    Lancement Maven
    => Lancement build1.xml
    => Vidage de la PermGen gràce à la commande magique
    => Lancement build1.xml
    => Vidage de la PermGen gràce à la commande magique
    => Lancement build3.xml

    Une autre piste est d'utiliser le fork pour allouer plusieurs JVM mais je ne sais pas comment détecter la fin du traitement.

    Si une bonne âme peut m'aider ce serait trop sympa.
    Merci d'avance.

  2. #2
    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
    pourquoi faire un lancement de ant par fichier et ne pas simplement tout mettre dans le build.xml, histoire que maven ne doive pas lancer 50 fois ant.

    Si le permgen est plein c'est qu'il n'y a rien de libérable dedans, tu ne trouvera donc pas de commande magique pour le nettoyer

  3. #3
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    Par défaut
    Ok merci pour la réponse.
    En fait, j'ai dans mon build.xml un target build-modules qui contient n fois ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <antcall target="build-module">
    <param name="flex.source.path" value="com/machin/chose/appli/projet/MonProjet.as" />
    <param name="flex.dest.path" value="com/machin/chose/appli/projet/MonProjet.swf" />
    <param name="flex.optimize" value="true" />
    <param name="flex.debug" value="false" />
    </antcall>
    La target build-module (sans s) se contente de faire un mxmlc du swf en paramètre. J'ai donc actuellement un build.xml qui lance toutes mes compilations et c'est ce build qui plante en PermGen space lors de la quarantième compilation.

    Il faudrait en fait pouvoir alloué une JVM pour un nombre réduit de module, faire la compilation puis libérer tout et recommencer.
    En découpant le build.xml en plusieurs cela ne change rien au problème.

    Si quelqu'un à une piste pour résoudre ce problème de compilation je suis preneur C'est quand même bizarre que la PermGen explose alors que j'ai environ seulement 1,6Mo (40ko*40 soit 1.6 Mo) de compiler.

  4. #4
    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
    quel rapport avec maven? t'as quoi dans ton pom.xml?

  5. #5
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    Par défaut
    Le problème ne concerne pas MAVEN mais uniquement ANT. Pour info voici la structure du fichier pom.xml

    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
     
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <id>compile-swf</id>
            <phase>compile</phase>
            <configuration>
            <tasks>
            <property name="flex.version" value="${flexVersion}" />
            <property name="flex.application.name" value="${applicationName}" />
     
    ...	
    <ant antfile="build.xml" dir="${basedir}" target="build" inheritAll="true" />
    </tasks>
    </configuration>
    Donc le pom.xml lance le ANT (build.xml) qui lui même lance autant de target que de module à compiler.
    MAVEN n'as à priori aucun rapport avec mon erreur car en lancant le build.xml directement depuis eclipse, je tombe sur mon problème.

    Donc une fois la piste MAVEN écarté, je me suis mis sur le paramètrage de la JVM lors du lancement de la compilation mxmlc. mais sans succés j'ai beau ajouté de MaxPermGen dans les variables d'environnement ou même au sein de la task mxmc avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <jvmarg value="-Xmx1024m -Xms128m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:MaxPermSize=512m -XX:PermSize=256m"/>
    Cela ne change rien au problème.

    Je pense qu'il faudrait changer de stratégie.
    A priori Ant est incapable de compiler un certain nombre de swf d'affilé, il tombe toujours en PermGen space. Quelqu'un aurait-il une idée sur comment compiler un très grand nombre de swf sans tomber en problème de mémoire ?
    Quelqu'un l'a t-il déja fait ?

  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
    pour ce que j'en lit de la doc maven antrun, les paramètres MAVEN_OPTS sont la manière d'augmenter la mémoire pour ant, puisque le plugin ne forke pas de process.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAVEN_OPTS=-Xmx1024m -Xms1024m -XX:MaxPermSize256m
    devrais faire l'affaire (note qu'il n'y a ni -D ni = pour ces paramètres de la jvm )

  7. #7
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 49
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    puisque le plugin ne forke pas de process.
    Tu es sûr ? Bon dans ce cas il va falloir que je voie une autre piste.
    Les paramètres que tu décrit sont déja dans mon MAVEN_OPTS.
    J'ai aussi essayer de les supprimer de là et de les mettre dans ANT_OPTS mais cela ne change pas le fait que je plante toujours au alentour de 20 à 50 compilations.

    En tout cas merci pour les pistes c'est sympa.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/12/2003, 13h14
  2. Temps d'affichage du swf
    Par oazar dans le forum Flash
    Réponses: 2
    Dernier message: 17/10/2003, 14h04
  3. Comment rafraichir le swf ?
    Par oazar dans le forum Flash
    Réponses: 3
    Dernier message: 17/10/2003, 13h08
  4. Fermer l'animation (swf/exe lancé depuis Windows)
    Par ZiZouJH dans le forum Flash
    Réponses: 3
    Dernier message: 14/01/2003, 10h00
  5. comment integer une animation swf dans une page
    Par naili dans le forum Intégration
    Réponses: 7
    Dernier message: 18/09/2002, 18h54

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