java.lang.Error: "Недостаточно памяти для обработки этой команды" при создании изображений
Я запускаю веб-приложение на BEA Weblogic 9.2. До недавнего времени мы использовали JDK 1.5.0_04 с JAI 1.1.2_01 и Image IO 1.1. В некоторых обстоятельствах (мы никогда не выясняли, почему именно), когда мы обрабатывали большие изображения (но не такие большие - несколько МБ), JVM зависала без какого-либо сообщения об ошибке, трассировки стека или чего-либо еще. В производстве такого не было много, но достаточно, чтобы быть неприятностью, и в итоге мы смогли воспроизвести это.
Мы решили переключиться на JRockit90 1.5.0_04 и больше не могли воспроизводить проблему в нашей тестовой среде, поэтому решили, что мы ее исправили. Однако теперь, после того как сервер приложений некоторое время работал, мы начинаем получать сообщение об ошибке "Недостаточно памяти для обработки этой команды" во время операций с изображениями. Например:
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)
Кто-нибудь видел что-то подобное раньше? Любая подсказка, что может происходить?
3 ответа
Маркус Адамс должен был заслужить доверие, но его маленький совет был в форме комментария, а не ответа, поэтому я не могу просто проверить это. Он указал мне на этот пример из другого ответа, и это помогло.
Посмотрел параметр реестра для \System\CurrentControlSet\Control\Session Manager\SubSystem и нашел его: SharedSection=1024,3072,512. Так как это была услуга (без головы), мы изменили третий номер. Новое значение было SharedSection=1024,3072,1024. Проблема не возникла после внесения этого изменения несколько недель назад.
Скорее всего, сообщение об ошибке говорит правду. Или упомянутое хранилище относится к месту на жестком диске? Вы уверены, что ваши диски не заполнены? В противном случае вам, вероятно, не хватит памяти какого-то типа, упомянутого в одном из других ответов. Я не уверен насчет weblogic или jrockit, но jdk от Sun Oracle имеет хороший инструмент под названием jconsole, который позволяет вам увидеть, что происходит с запущенным приложением. Он должен быть в состоянии рассказать вам о потреблении памяти и т. Д. (Инструмент использует jms, поэтому может даже работать на других jdk)
Похоже, это может быть связано с нехваткой места в стеке для вашего потока. Смотрите этот пост http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4765019. JVM имеет аргумент -Xss для управления размером стека, хотя, если вы превышаете его, кажется, что вы можете создавать сразу много потоков...