2

我在 BEA Weblogic 9.2 上运行一个 Web 应用程序。直到最近,我们还在使用 JDK 1.5.0_04、JAI 1.1.2_01 和 Image IO 1.1。在某些情况下(我们从未弄清楚究竟是为什么),当我们处理大图像(但不是那么大 - 几 MB)时,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)

有没有人见过这样的东西?任何线索可能会发生什么?

4

3 回答 3

4

Marcus Adams 应该为此受到赞扬,但他的小建议是以评论的形式而不是答案的形式,所以我不能只是检查它。他从另一个答案中向我指出了这个例子,这就是诀窍。

查看 \System\CurrentControlSet\Control\Session Manager\SubSystem 的注册表设置,发现:SharedSection=1024,3072,512。由于这是一项服务(无头),我们更改了第三个数字。新值是 SharedSection=1024,3072,1024。自几周前进行此更改以来,该问题没有再次出现。

于 2010-06-07T04:35:57.960 回答
0

错误消息很可能是在说真话。提到的存储是指硬盘空间吗?你确定你的磁盘没有满。否则,您可能已经耗尽了其他答案之一中提到的某种内存。我不确定 weblogic 或 jrockit,但Sun Oracle 的 jdk 有一个名为 jconsole 的好工具,可让您查看正在运行的应用程序发生了什么。它应该能够告诉您有关内存消耗等的信息。(该工具使用 jms,因此甚至可以在其他 jdk 上工作)

于 2010-04-14T20:24:53.823 回答
0

这听起来可能与线程的堆栈空间不足有关。请参阅这篇文章http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4765019。JVM 有一个 -Xss 参数来控制堆栈大小,但如果你超过它,听起来你可能会同时创建大量线程......

于 2010-04-14T19:05:15.907 回答