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,为什么不自己做呢?