Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OutofMemory奇怪的错误_Java_Performance_Memory Management - Fatal编程技术网

Java OutofMemory奇怪的错误

Java OutofMemory奇怪的错误,java,performance,memory-management,Java,Performance,Memory Management,我已经使用以下命令从命令行启动了我的jar java -Xms1200m -Xmx1500m -jar xxx.jar 我正在创建BufferedImage,大小为12600*12600意味着它需要 在下面的代码中有606MB的内存 TranscoderInput input = new TranscoderInput(sr); String pngFile = "Style-" + shoeViewer.getCurrentStyle() + "_"

我已经使用以下命令从命令行启动了我的
jar

java -Xms1200m -Xmx1500m -jar xxx.jar
我正在创建
BufferedImage
,大小为12600*12600意味着它需要

在下面的代码中有606MB的内存

TranscoderInput input = new TranscoderInput(sr);

            String pngFile = "Style-" + shoeViewer.getCurrentStyle() + "_"
                    + shoeViewer.getSelectedMetadata().getSizeLabel()
                    + "_400DPI" + ".png";

            File outputFile = new File(pngFile);

            FileOutputStream fo = new FileOutputStream(outputFile);

            TranscoderOutput output = new TranscoderOutput(fo);

            long now = System.currentTimeMillis();

            t.transcode(input, null);
当我在执行上述行之前调试内存使用时,我的运行时显示

我需要606 MB的内存,1100 MB仍然可用

因此,当我在34分钟后运行上述代码时,它会抛出
OutOfMemory
异常

有什么问题?是进程问题还是堆问题?为什么需要34分钟??

我的电脑配置如下

Windows 32bit XP Service Pack2 Home Edition
Amd Athlon (tm) 7750 Dual Core 2.71 GHz
2GB of DDR2 RAM
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) Client VM (build 23.7-b01, mixed mode, sharing)
java -Xms900m -Xmx1024m -XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=70 -jar myjar.jar
请帮我解决这个问题

下面是带有调试消息的异常堆栈tarce

在运行上述代码之前,我将VM参数更改为

Windows 32bit XP Service Pack2 Home Edition
Amd Athlon (tm) 7750 Dual Core 2.71 GHz
2GB of DDR2 RAM
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) Client VM (build 23.7-b01, mixed mode, sharing)
java -Xms900m -Xmx1024m -XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=70 -jar myjar.jar
从SVG阅读器构建XML文档。。。。 从SVG读取器生成XML文档已完成。。。。 正在将修改的XML文档转换为字符串编写器。。。。 已完成将修改的XML文档转换为字符串编写器。。。。 claimedBytes 766可用字节900189232 记忆状态学------------------------ 总内存为字节:912326656总内存为兆字节:870 已用内存为字节:9308384已用内存为兆字节:8 可用内存为字节:900189096可用内存为兆字节:858


代码转换开始于:2013年3月24日星期日11:09:59

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa
ce
        at java.awt.image.DataBufferInt.<init>(Unknown Source)
        at java.awt.image.SinglePixelPackedSampleModel.createDataBuffer(Unknown
Source)
        at java.awt.image.Raster.createWritableRaster(Unknown Source)
        at org.apache.batik.gvt.renderer.StaticRenderer.updateWorkingBuffers(Sta
ticRenderer.java:536)
        at org.apache.batik.gvt.renderer.StaticRenderer.repaint(StaticRenderer.j
ava:375)
        at org.apache.batik.gvt.renderer.StaticRenderer.repaint(StaticRenderer.j
ava:344)
        at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTran
scoder.java:111)
        at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstra
ctTranscoder.java:142)
        at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstra
ctTranscoder.java:156)
        at com.mmg.app.eventlistener.PlaceOrderActionListener.save(PlaceOrderAct
ionListener.java:302)
        at com.mmg.app.eventlistener.PlaceOrderActionListener.saveCanvas(PlaceOr
derActionListener.java:270)
        at com.mmg.app.eventlistener.PlaceOrderActionListener.actionPerformed(Pl
aceOrderActionListener.java:143)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$200(Unknown Source)
线程“AWT-EventQueue-0”java.lang.OutOfMemoryError中的异常:java堆spa 总工程师 位于java.awt.image.DataBufferInt。(未知源) 位于java.awt.image.SinglePixelPackedSampleModel.createDataBuffer(未知 (来源) 位于java.awt.image.Raster.createWritableRaster(未知源) 位于org.apache.batik.gvt.renderer.StaticRenderer.updateWorkingBuffers(Sta (java:536) 位于org.apache.batik.gvt.renderer.StaticRenderer.repaint(StaticRenderer.j ava:375) 位于org.apache.batik.gvt.renderer.StaticRenderer.repaint(StaticRenderer.j (电话:344) 在org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTran scoder.java:111) 在org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstra ctTranscoder.java:142) 在org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstra ctTranscoder.java:156) 在com.mmg.app.eventlistener.PlaceOrderActionListener.save(PlaceOrderAct ionListener.java:302) 在com.mmg.app.eventlistener.PlaceOrderActionListener.saveCanvas(PlaceOr derActionListener.java:270) 在com.mmg.app.eventlistener.PlaceOrderActionListener.actionPerformed(Pl aceOrderActionListener.java:143) 在javax.swing.AbstractButton.fireActionPerformed(未知源) 位于javax.swing.AbstractButton$Handler.actionPerformed(未知源) 在javax.swing.DefaultButtonModel.fireActionPerformed(未知源) 位于javax.swing.DefaultButtonModel.setPressed(未知源) 在javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知) (行政长官) 位于java.awt.Component.ProcessMouseeEvent(未知源) 位于javax.swing.JComponent.ProcessMouseeEvent(未知源) 位于java.awt.Component.processEvent(未知源) 位于java.awt.Container.processEvent(未知源) 位于java.awt.Component.dispatchEventImpl(未知源) 位于java.awt.Container.dispatchEventImpl(未知源) 位于java.awt.Component.dispatchEvent(未知源) 位于java.awt.LightweightDispatcher.RetargetMouseeEvent(未知源) 位于java.awt.LightweightDispatcher.ProcessMouseeEvent(未知源) 位于java.awt.LightweightDispatcher.dispatchEvent(未知源) 位于java.awt.Container.dispatchEventImpl(未知源) 位于java.awt.Window.dispatchEventImpl(未知源) 位于java.awt.Component.dispatchEvent(未知源) 位于java.awt.EventQueue.dispatchEventImpl(未知源) 位于java.awt.EventQueue.access$200(未知源)
即使原始的未编码图像仅占600 MB左右,编码器中的内部表示也可能需要更多内存,具体取决于其实现方式。以下示例显示了将简单svg文件缩放到12600 x 12600(32位)时使用的内存量

在我的机器上,输出为:

AllocatedMemory:    4096 Kb 
AllocatedMemory:    1677721 Kb

因此,这里的程序使用1677 MB将一个简单的SVG文件转换为12600*12600 PNG文件。

@TReddy如果你知道答案,那么为什么你不给出它?@Maroun你知道答案吗?什么类型的对象是
t
?@ecbrodie哦,对不起,我忘了提到t是Apache Batik库中的PngTransCoder。你应该使用-XX:+HeapDumpOnAutofMemoryError标志,并分析堆转储。YourKit是一个非常好的工具,但是JVisualVM也很容易使用,而且是免费的(你可以在JDK文件夹中找到它)。你的电脑中有多少GB内存?在你的电脑上运行上述代码需要多长时间?好的,我在其他内存更高的电脑上试用过,它可以正常工作,现在你能给我一个电脑配置,在这个配置上运行这些代码没有任何问题吗?您的JDK配置和磁盘上生成(转码)PNG的文件大小(MB)?我的电脑中有8GB。我在程序中编码的文件来自wikipedia:[link],大约需要20秒。要在我的电脑上处理,请提供大小为1.1 MB的输出文件。我在Eclipse中运行了这个程序,没有特殊的选项。另一件事是用多色图像测试你的程序,请告诉我生成的png文件的大小和生成文件所需的时间。你可以在这里找到很多多色SVG,为什么不自己做呢?