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 :

[JDK 7 - 64bits - Macintosh]StackOverflowError


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut [JDK 7 - 64bits - Macintosh]StackOverflowError
    Salut,

    Je suis en train de migrer une application de JavaSE 1.5 (Eclipse RCP 3.5) vers JavaSE 1.7 (Eclipse 3.8.2). Alors que la nouvelle version fonctionne sans problème sur Windows, en 32 bits, comme en 64 bits, la version buildée pour MacOSX et JDK 1.7 64bits cause une StackOverFlowError que je ne comprends pas. L'application n'a pas posé de problème similaire lorsqu'elle était buildée en JavaSE 1.5, sous Eclipse 3.5, que cela soit sous Windows 32bts, ou Macintosh 32bits, (java 1.5 ou java 1.6 installé sur la machine).

    J'ai tenté différent paramètres de taille de stack (-Xss), 512K, 1Mo, 2Mo, et allant même jusqu'à 75Mo : j'obtiens toujours cette erreur. J'ai du mal à situer les conditions de l'erreur. Elle survient toujours dans un appel de socketRead0 dans SocketInputStream, initié dans la bibilothèque Apache HttpClient, à laquelle j'accède par l'intermédiaire d'une bibliothèque sur laquelle je n'ai pas la maîtrise, mais j'ai des milliers d'autres requêtes utilisant les mêmes classes et méthodes qui fonctionnent sans problème, et ce, pour charger quelques octets, comme pour charger quelques gigaoctets. J'ai cru constater que l'erreur survenait lors de tâches gérées par un ExecutorService, combinées avec une GUI SWT et AWT, un environnement, donc "fortement" threadé, mais d'autres composants d'interface similaires (utilisant le même composant de GUI SWT/AWT), et qui font des requêtes similaires (mais sans pool de threads), fonctionnent. D'autres composants avec pool de threads, mais sans GUI SWT/AWT fonctionnent. Enfin bref, différentes combinaisons de conditions, fonctionnent ou pas, sans qu'il soit évident de déterminer quel composant est responsable, ou quelle combinaison de composants.

    Je suis en train d'expérimenter (à tâtons) différentes options de résolution ou contournement (comme upgrader la version de httpclient par exemple), mais je suis à la recherche d'idées de voies à explorer.

    Pour information, voici l'une des stack traces que j'obtiens :

    !ENTRY ERROR pool-6-Gallery image refresh fr.wedia.noheto.press.ui.view.stockpage::gallery-1 (fr.wedia.noheto.engine.ui.newbaskets.internal.GalleryImageRefresher:114) 2014-02-13 14:50:51,274[36470]!MESSAGE Cannot refresh item image
    com.noheto.remote.interfaces.CommunicationException: Communication : java.lang.StackOverflowError null
        at com.noheto.remote.impl.client.Remotehandler.invoke(Remotehandler.java:412)
        at com.sun.proxy.$Proxy2.getMetas(Unknown Source)
        at com.noheto.remote.impl.client.ResourceManagerServiceImpl.getMetas(ResourceManagerServiceImpl.java:44)
        at com.noheto.remote.impl.common.ServerResource._getMetas(ServerResource.java:56)
        at com.noheto.remote.impl.common.ServerResource.isFile(ServerResource.java:78)
        at fr.wedia.noheto.engine.model.Resource.isFile(Resource.java:157)
        at fr.wedia.noheto.template.AbstractCompositionInstance.hasCompositionFile(AbstractCompositionInstance.java:870)
        at fr.wedia.noheto.template.AbstractCompositionInstance.getPreviewIcon(AbstractCompositionInstance.java:1162)
        at fr.wedia.noheto.engine.ui.newbaskets.renderer.DefaultGalleryItemRenderer$PreviewIconRefreshHandler.getImage(DefaultGalleryItemRenderer.java:61)
        at fr.wedia.noheto.engine.ui.newbaskets.internal.GalleryImageRefresher$1.run(GalleryImageRefresher.java:76)
        at fr.wedia.util.java.concurrent.SafeRunnableWrapper.run(SafeRunnableWrapper.java:28)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
        at fr.wedia.util.java.thread.DefaultThreadPoolFactory$1.run(DefaultThreadPoolFactory.java:108)
    Cause :
    java.lang.StackOverflowError
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:152)
        at java.net.SocketInputStream.read(SocketInputStream.java:122)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
        at org.apache.commons.httpclient.HttpConnection.isStale(HttpConnection.java:506)
        at org.apache.commons.httpclient.HttpConnection.closeIfStale(HttpConnection.java:431)
        at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.closeIfStale(MultiThreadedHttpConnectionManager.java:1313)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:382)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
        at com.noheto.remote.impl.client.Remotehandler.invoke(Remotehandler.java:396)
        at com.sun.proxy.$Proxy2.getMetas(Unknown Source)
        at com.noheto.remote.impl.client.ResourceManagerServiceImpl.getMetas(ResourceManagerServiceImpl.java:44)
        at com.noheto.remote.impl.common.ServerResource._getMetas(ServerResource.java:56)
        at com.noheto.remote.impl.common.ServerResource.isFile(ServerResource.java:78)
        at fr.wedia.noheto.engine.model.Resource.isFile(Resource.java:157)
        at fr.wedia.noheto.template.AbstractCompositionInstance.hasCompositionFile(AbstractCompositionInstance.java:870)
        at fr.wedia.noheto.template.AbstractCompositionInstance.getPreviewIcon(AbstractCompositionInstance.java:1162)
        at fr.wedia.noheto.engine.ui.newbaskets.renderer.DefaultGalleryItemRenderer$PreviewIconRefreshHandler.getImage(DefaultGalleryItemRenderer.java:61)
        at fr.wedia.noheto.engine.ui.newbaskets.internal.GalleryImageRefresher$1.run(GalleryImageRefresher.java:76)
        at fr.wedia.util.java.concurrent.SafeRunnableWrapper.run(SafeRunnableWrapper.java:28)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
        at fr.wedia.util.java.thread.DefaultThreadPoolFactory$1.run(DefaultThreadPoolFactory.java:108)
    Merci par avance de votre attention et vos suggestions.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    J'ai trouvé la raison de mon problème : j'utilisais une ThreadPoolFactory personnalisée qui utilisait un paramétrage de stacksize arbitraire, qui ne suffisait pas pour le mac, en 1.7, mais qui ne posait pas de problème dans les autres cas. Sans ce paramètre (la valeur 0), tout fonctionne bien. Forcément, ça explique pourquoi le paramètre -Xss ne semblait avoir aucun impact.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    C'est intéressant à savoir : j'ignorais complètement que l'on pouvait changer la stackSize d'un thread !


    a++

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    En fait, la prise en compte de ce paramètre est dépendante de la plateforme. Il est manifestement ignoré sous Windows (quelque soit la version de Windows, de java, et en 32 bits comme en 64 bits). Je ne sais pas s'il était pris en compte sur Macintosh, parce qu'il y a dans notre ThreadPoolFactory, un hack pour que sous java 1.6, elle délègue la création des threads à une instance de DefaultThreadPoolFactory (Sinon jil y avait un crash lors de la création du thread dans la jvm apple), et que toutes les machines de production, donc les machines de test, sont installées avec java 1.6. Du coup, en passant en 1.7, la délégation n'était plus activée, et la création de thread était faite avec des valeurs par défaut, dont la stacksize, qui avait une valeur complètement stupide (et en plus incohérente avec les stack traces observées lors du StackOverflowError), valeur masquée par la fabrique de délégation.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Passer du JDK 7 64bits au JDK 7 32bits ?
    Par Gugelhupf dans le forum Général Java
    Réponses: 2
    Dernier message: 17/07/2013, 14h27
  2. [TOMCAT]JDk-1.2. et Tomcat-4.2
    Par itsmii dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 05/09/2003, 11h26
  3. Flash sous macintosh
    Par marco dans le forum Flash
    Réponses: 2
    Dernier message: 05/06/2003, 00h05
  4. C sur Macintosh
    Par Strider dans le forum Autres éditeurs
    Réponses: 8
    Dernier message: 31/03/2003, 17h38
  5. Réseaux Macintosh/Linux
    Par hoby dans le forum Développement
    Réponses: 3
    Dernier message: 16/11/2002, 23h44

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