2010-04-14 2 views
1

Я запускаю веб-приложение на BEA Weblogic 9.2. До недавнего времени мы использовали JDK 1.5.0_04, с JAI 1.1.2_01 и Image IO 1.1. В некоторых случаях (мы никогда не выяснили, почему именно), когда мы обрабатывали большие изображения (но не такие большие - несколько МБ), JVM вылетает без каких-либо сообщений об ошибках или трассировки стека или чего-то еще. Это было не так много в производстве, но достаточно, чтобы быть неприятностью, и в конечном итоге мы смогли воспроизвести его.java.lang.Error: «Недостаточно памяти для обработки этой команды» при создании изображений

Мы решили переключиться на 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) 

Кто-нибудь видел что-то подобное раньше? Есть ли смысл в том, что может произойти?

+2

Также см. Http://stackoverflow.com/questions/507853/system-error-code-8-not-enough-storage-is-available-to-process-this-command и http://stackoverflow.com/questions/548971/win32exception-not-enough-storage-is-available-to-process-this-command –

+0

Интересно. Он работает на 32-разрядной версии Windows Server 2003 R2 (Standard). Аппарат имеет 3,83 ГБ или оперативную память. Глядя на параметр реестра для \ System \ CurrentControlSet \ Control \ Session Manager \ SubSystem и нашел это: SharedSection = 1024,3072,512. В вопросе, который вы указали, предлагается изменить среднее число. Правильно ли это изменить для безголового приложения, работающего как служба? – jhericks

+0

Мы все еще не можем найти проблему, но мы собираемся настроить третье число (512) на 1024 и посмотреть, помогает ли это ситуации. – jhericks

ответ

2

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

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

+0

+1 для изменения последнего номера.Работа для меня 2 :) –

0

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

+0

Возможно, эта ошибка существует и в JRockit? Если да, будет ли исправление, поставленное в тигр-b05, скорее всего применимым к обновленному JRockit? – jhericks

+0

Не уверен. Но если это ваша проблема, сколько потоков вы создаете? Можете ли вы масштабировать это назад? –

+0

Мы сами не создаем нити - WebLogic. Мы использовали для подсчета количества потоков, но с 9.0 WebLogic «автоматически настраивает» пул потоков, но я уверен, что есть способ уменьшить масштаб. – jhericks

0

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

Смежные вопросы