2010-04-14 29 views
1

J'utilise une application web sur BEA Weblogic 9.2. Jusqu'à récemment, nous utilisions JDK 1.5.0_04, avec JAI 1.1.2_01 et Image IO 1.1. Dans certaines circonstances (nous n'avons jamais compris exactement pourquoi), lorsque nous traitions des images volumineuses (mais pas très volumineuses - quelques Mo), la machine virtuelle Java se bloquait sans message d'erreur ou trace de pile ou quoi que ce soit. Cela ne s'est pas produit beaucoup en production, mais assez pour être une nuisance et finalement nous avons pu le reproduire.java.lang.Error: "Il n'y a pas assez de mémoire disponible pour traiter cette commande" lors de la génération des images

Nous avons décidé de passer à JRockit90 1.5.0_04 et nous n'étions plus en mesure de reproduire le problème dans notre environnement de test, nous avons donc pensé que nous l'avions léchée. Maintenant, cependant, après que le serveur d'applications a été mis en place pendant un certain temps, nous commençons à recevoir le message d'erreur "Pas assez de mémoire disponible pour traiter cette commande" pendant les opérations d'image. Par exemple:

java.lang.Error: Error starting thread: Not enough storage is available to process this command. 
at java.lang.Thread.start()V(Unknown Source) 
at sun.awt.image.ImageFetcher$1.run(ImageFetcher.java:279) 
at sun.awt.image.ImageFetcher.createFetchers(ImageFetcher.java:272) 
at sun.awt.image.ImageFetcher.add(ImageFetcher.java:55) 
at sun.awt.image.InputStreamImageSource.startProduction(InputStreamImageSource.java:149) 
at sun.awt.image.InputStreamImageSource.addConsumer(InputStreamImageSource.java:106) 
at sun.awt.image.InputStreamImageSource.startProduction(InputStreamImageSource.java:144) 
at sun.awt.image.ImageRepresentation.startProduction(ImageRepresentation.java:647) 
at sun.awt.image.ImageRepresentation.prepare(ImageRepresentation.java:684) 
at sun.awt.SunToolkit.prepareImage(SunToolkit.java:734) 
at java.awt.Component.prepareImage(Component.java:3073) 
at java.awt.ImageMediaEntry.startLoad(MediaTracker.java:906) 
at java.awt.MediaEntry.getStatus(MediaTracker.java:851) 
at java.awt.ImageMediaEntry.getStatus(MediaTracker.java:902) 
at java.awt.MediaTracker.statusAll(MediaTracker.java:454) 
at java.awt.MediaTracker.waitForAll(MediaTracker.java:405) 
at java.awt.MediaTracker.waitForAll(MediaTracker.java:375) 
at SfxNET.System.Drawing.ImageLoader.loadImage(Ljava.awt.Image;)Ljava.awt.image.BufferedImage;(Unknown Source) 
at SfxNET.System.Drawing.ImageLoader.loadImage(Ljava.net.URL;)Ljava.awt.image.BufferedImage;(Unknown Source) 
at Resources.Tools.Commands.W$zw(Ljava.lang.ClassLoader;)V(Unknown Source) 
at Resources.Tools.Commands.getContents()[[Ljava.lang.Object;(Unknown Source) 
at SfxNET.sfxUtils.SfxResourceBundle.handleGetObject(Ljava.lang.String;)Ljava.lang.Object;(Unknown Source) 
at java.util.ResourceBundle.getObject(ResourceBundle.java:320) 
at SoftwareFX.internal.ChartFX.wxvw.yxWW(Ljava.lang.String;Z)Ljava.lang.Object;(Unknown Source) 
at SoftwareFX.internal.ChartFX.wxvw.vxWW(Ljava.lang.String;)Ljava.lang.Object;(Unknown Source) 
at SoftwareFX.internal.ChartFX.CommandBar.YWww(LSoftwareFX.internal.ChartFX.wxvw;IIII)V(Unknown Source) 
at SoftwareFX.internal.ChartFX.Internet.Server.xxvw.YzzW(LSoftwareFX.internal.ChartFX.Internet.Server.ChartCore;Z)LSoftwareFX.internal.ChartFX.CommandBar;(Unknown Source) 
at SoftwareFX.internal.ChartFX.Internet.Server.xxvw.XzzW(LSoftwareFX.internal.ChartFX.Internet.Server.ChartCore;)V(Unknown Source) 
at SoftwareFX.internal.ChartFX.Internet.Server.ChartCore.OnDeserialization(Ljava.lang.Object;)V(Unknown Source) 
at SoftwareFX.internal.ChartFX.Internet.Server.ChartCore.Zvvz(LSoftwareFX.internal.ChartFX.Base.wzzy;)V(Unknown Source) 

Est-ce que quelqu'un a déjà vu quelque chose comme ça? Toute idée de ce qui pourrait arriver?

+2

Voir aussi http://stackoverflow.com/questions/507853/system-error-code-8-not-enough-storage-is-available-to-process-this-command et http://stackoverflow.com/questions/548971/win32exception-pas-assez-de-stockage-est-disponible-pour-traiter-cette-commande –

+0

Intéressant. Il fonctionne sur Windows Server 2003 R2 32 bits (Standard). La machine a 3,83 Go ou RAM installée. En regardant le paramètre de Registre pour \ System \ CurrentControlSet \ Control \ Session Manager \ SubSystem et trouvé ceci: SharedSection = 1024,3072,512. La question que vous avez référencée suggère de changer le numéro du milieu. Est-ce toujours la bonne chose à changer pour une application sans tête fonctionnant en tant que service? – jhericks

+0

Nous ne pouvons toujours pas trouver le problème, mais nous allons ajuster le 3ème chiffre (512) à 1024 et voir si cela aide la situation. – jhericks

Répondre

2

Marcus Adams devrait avoir le crédit pour cela, mais son petit conseil était sous la forme d'un commentez pas une réponse, donc je ne peux pas juste vérifier. Il m'a indiqué this example from another answer et cela a fait l'affaire.

En regardant le paramètre de Registre pour \ System \ CurrentControlSet \ Control \ Gestionnaire de session \ SubSystem et trouvé ceci: SharedSection = 1024,3072,512. Comme c'était un service (sans tête), nous avons changé le troisième numéro. La nouvelle valeur était SharedSection = 1024,3072,1024. Le problème ne s'est pas reproduit depuis ce changement il y a quelques semaines.

+0

+1 pour changer le dernier numéro.Travaillé pour moi 2 :) –

0

Cela semble être lié à un manque d'espace de pile pour votre thread. Voir cet article http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4765019. La JVM a un argument -Xss pour contrôler la taille de la pile, mais si vous la dépassez, il semble que vous créez beaucoup de threads en même temps ...

+0

Est-ce que ce bug existe aussi dans JRockit? Si oui, le correctif fourni dans tiger-b05 s'appliquera-t-il probablement à un JRockit mis à jour? – jhericks

+0

Je ne suis pas sûr. Mais si c'est votre problème, combien de threads créez-vous? Pouvez-vous redimensionner cela? –

+0

Nous ne créons pas vraiment les threads nous-mêmes - WebLogic est. Nous avions l'habitude d'ajuster le nombre de threads, mais depuis 9.0, WebLogic "ajuste automatiquement" le pool de threads, mais je suis sûr qu'il y a un moyen de réduire cela. – jhericks

0

Le message d'erreur est probablement le suivant: vérité. Soit le stockage mentionné fait référence à l'espace disque? Êtes-vous sûr que vos disques ne sont pas pleins? Sinon, vous avez probablement manquer de mémoire d'une sorte comme mentionné dans l'une des autres réponses. Je ne suis pas sûr de weblogic ou de jrockit mais Sun Oracle jdk a un bel outil appelé jconsole qui vous permet de voir ce qui se passe avec votre application en cours d'exécution. Il devrait être capable de vous parler de la consommation de mémoire, etc. (L'outil utilise jms, donc pourrait même fonctionner sur les autres jdk)