java.lang.Error: «Недостаточно памяти для обработки этой команды» при создании изображений - PullRequest
2 голосов
/ 14 апреля 2010

Я запускаю веб-приложение на 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 ]

3 голосов
/ 07 июня 2010

Маркус Адамс должен был заслужить это, но его маленький совет был в форме комментария, а не ответа, поэтому я не могу просто проверить это. Он указал мне на этот пример из другого ответа , и это помогло.

Просматривая параметр реестра для \ System \ CurrentControlSet \ Control \ Session Manager \ SubSystem и обнаружил следующее: SharedSection = 1024,3072,512. Так как это была услуга (без головы), мы изменили третий номер. Новое значение было SharedSection = 1024,3072,1024. С тех пор, как это изменение произошло несколько недель назад, проблема не повторялась.

0 голосов
/ 15 апреля 2010

Скорее всего, сообщение об ошибке говорит правду. Или упомянутое хранилище относится к месту на жестком диске? Вы уверены, что ваши диски не работают полностью? В противном случае вам, вероятно, не хватит памяти какого-то типа, упомянутого в одном из других ответов. Я не уверен насчет weblogic или jrockit, но Sun Oracle jdk имеет хороший инструмент под названием jconsole, который позволяет вам увидеть, что происходит с запущенным приложением. Он должен быть в состоянии рассказать вам о потреблении памяти и т. Д. (Инструмент использует jms, поэтому может даже работать на других jdk)

0 голосов
/ 14 апреля 2010

Похоже, это может быть связано с нехваткой места в стеке для вашего потока. См. Этот пост http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4765019. JVM имеет аргумент -Xss для управления размером стека, хотя, если вы превышаете его, звучит так, как будто вы создаете много потоков одновременно ...

...