java.lang.Message d'erreur: “Pas assez de mémoire disponible pour traiter cette commande” lors de la génération d'images
Je suis en cours d'exécution d'une application web sur BEA Weblogic 9.2. Jusqu'à récemment, nous avons été à l'aide du JDK 1.5.0_04, avec JAI 1.1.2_01 et de l'Image OI 1.1. Dans certains cas (nous n'avons jamais compris exactement pourquoi), quand nous étions de traitement d'images de grande taille (mais pas que grand - quelques MO), la JVM crash sans aucun message d'erreur ni de trace de pile ou quoi que ce soit. Cela n'a pas beaucoup dans la production, mais assez pour être une nuisance et finalement nous avons été en mesure de le reproduire.
Nous avons décidé de passer à JRockit90 1.5.0_04 et nous ne sommes plus en mesure de reproduire le problème dans notre environnement de test, nous avons pensé qu'il avait léché. Maintenant, cependant, après que le serveur d'application a été pendant un certain temps, on commence à obtenir le message d'erreur "Pas assez de mémoire disponible pour traiter cette commande" lors des opérations. 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)
Quelqu'un a vu quelque chose comme ça avant? Aucune idée de ce qui se passe?
- Voir aussi stackoverflow.com/questions/507853/... et stackoverflow.com/questions/548971/...
- Intéressant. Il est en cours d'exécution sur la 32 bits de Windows Server 2003 R2 (Standard). La machine a 3.83 GO de RAM. En regardant le paramètre de registre pour \System\CurrentControlSet\Control\Session Manager\système et trouvé ceci: SharedSection=1024,3072,512. La question que vous l'avez mentionné suggéré de changer le moyen de nombre. Est-ce toujours la bonne chose à changer pour une tête d'application exécute en tant que service?
- Nous ne trouvez toujours pas le problème, mais nous allons régler le 3ème numéro (512) 1024 et voir si cela aide la situation.
Vous devez vous connecter pour publier un commentaire.
Marcus Adams devrait obtenir le crédit pour cela, mais son peu de conseils sous la forme d'un commentaire n'est pas une réponse, donc je ne peux pas il suffit de la cocher. Il m'a indiqué cet exemple d'une autre réponse et qui a fait le tour.
En regardant le paramètre de registre pour \System\CurrentControlSet\Control\Session Manager\système et trouvé ceci: SharedSection=1024,3072,512. Puisque c'est un service (sans tête), nous avons changé le troisième numéro. La nouvelle valeur a été SharedSection=1024,3072,1024. Le problème n'est pas réapparue depuis ce changement il y a quelques semaines.
Cela sonne comme il pourrait être lié à manquer d'espace de pile pour votre thread. Voir ce post http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4765019. La JVM a un -Xss argument pour contrôler la taille de la pile, mais si vous êtes un dépassement de ce seuil, on dirait que vous vous créez tout un tas de fils à la fois...
Probablement le message d'erreur est de dire la vérité. Le stockage mentionné se réfère à l'espace du disque dur? Êtes-vous sûr que vos disques ne sont pas en cours d'exécution complète. Sinon, vous avez probablement à court de mémoire, de la sorte, comme mentionné dans l'une des autres réponses. Je ne suis pas sûr de weblogic ou jrockit mais
SoleilOracle jdk est un bel outil jconsole qui vous permet de voir ce qui se passe avec votre application en cours d'exécution. Il devrait être en mesure de vous dire à propos de la consommation de mémoire etc. (L'outil utilise jms donc peut même travailler sur les autres du jdk)