java.lang.Error:生成图像时“没有足够的存储空间来处理此命令”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2640239/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 22:10:22  来源:igfitidea点击:

java.lang.Error: "Not enough storage is available to process this command" when generating images

javamemoryawtjrockitchartfx

提问by jhericks

I am running a web application on BEA Weblogic 9.2. Until recently, we were using JDK 1.5.0_04, with JAI 1.1.2_01 and Image IO 1.1. In some circumstances (we never figured out exactly why), when we were processing large images (but not that large - a few MB), the JVM would crash without any error message or stack trace or anything. This didn't happen much in production, but enough to be a nuisance and eventually we were able to reproduce it.

我正在 BEA Weblogic 9.2 上运行 Web 应用程序。直到最近,我们还在使用 JDK 1.5.0_04、JAI 1.1.2_01 和 Image IO 1.1。在某些情况下(我们从未想出确切原因),当我们处理大图像(但不是那么大 - 几 MB)时,JVM 会崩溃而没有任何错误消息或堆栈跟踪或任何内容。这在生产中并没有发生太多,但足以令人讨厌,最终我们能够重现它。

We decided to switch to JRockit90 1.5.0_04 and we were no longer able to reproduce the problem in our test environment, so we thought we had it licked. Now, however, after the application server has been up for a while, we start getting the error message, "Not enough storage is available to process this command" during image operations. For example:

我们决定切换到 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.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)

Has anyone seen something like this before? Any clue what might be happening?

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

回答by jhericks

Marcus Adams should get the credit for this, but his little advice was in the form of a comment not an answer, so I can't just check it. He pointed me to this example from another answerand that did the trick.

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

Looking at the registry setting for \System\CurrentControlSet\Control\Session Manager\SubSystem and found this: SharedSection=1024,3072,512. Since this was a service (headless) we changed the third number. The new value was SharedSection=1024,3072,1024. The problem has not recurred since making this change a few weeks ago.

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

回答by Jeff Storey

This sounds like it could be related to running out of stack space for your thread. See this post http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4765019. The JVM has a -Xss argument to control the stack size, though if you're exceeding it, it sounds like you may be creating a whole lot of threads at once...

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

回答by Paul de Vrieze

Most likely the error message is telling the truth. Either the storage mentioned refers to hard disk space? Are you sure your disks aren't running full. Otherwise you have probably run out of memory of some sort like mentioned in one of the other answers. I'm not sure about weblogic or jrockit but SunOracle's jdk has a nice tool called jconsole that allows you to see what's going on with your running application. It should be able to tell you about the memory consumption etc. (The tool uses jms so might even work on the other jdk's)

最有可能的错误消息说的是实话。提到的存储是指硬盘空间吗?你确定你的磁盘没有满。否则,您可能已经耗尽了其他答案之一中提到的某种类型的内存。我不确定 weblogic 或 jrockit,但SunOracle 的 jdk 有一个很好的工具 jconsole,它允许您查看正在运行的应用程序的情况。它应该能够告诉您内存消耗等(该工具使用 jms,因此甚至可能适用于其他 jdk)