2013-03-23 3 views
3

я начал мой jar из командной строки с помощью следующей командыJava OutOfMemory Странная ошибка

java -Xms1200m -Xmx1500m -jar xxx.jar 

и я создаю BufferedImage, который находится в размере 12600 * 12600 означает, что он требует

606 MB памяти в следующем коде

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 МБ памяти и МБ по-прежнему свободен.

Так что, когда я пробегаю над кодами через 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) 

пожалуйста, помогите мне решить эту проблему.

Ниже приведена таблица стека исключений с отладочными сообщениями.

перед запуском выше кода я изменил VM аргумент следующий

java -Xms900m -Xmx1024m -XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=70 -jar myjar.jar 

Building XML документ от SVG чтения .... Сложение завершена из XML-документа из SVG чтения .... Преобразование модифицированного документа XML для String Writer .... Преобразование завершено с измененным XML-документом в String Writer .... утверждал, что у него 766 Avaialbel Bytes 900189232 Память статистики -------------------- ---- Общая память - это байты: 912326656 Общая память - мегабайт: 870 Используется память байты: 9308384 Используется памятью является мегабайтом: 8 FreeMemory является байтами: 900189096 Свободной памяти мегабайты: 858


транскодирования начал в: Sun 24 марта 11:09:59 IST 2013

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) 
+4

@TReddy, если вы знаете ответ, то почему вы его не дадите? – Mihir

+0

@ Марун, ты знаешь ответ? – Mihir

+1

Какой тип объекта 't'? – ecbrodie

ответ

2

Даже через необработанное изображение не заполнено до 600 МБ, внутреннему представлению в кодере может потребоваться больше памяти в зависимости от того, как оно реализовано. В следующем примере показано, сколько памяти используется при масштабировании простого файла svg до 12600 x 12600 (32 бит).

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

import org.apache.batik.transcoder.TranscoderInput; 
import org.apache.batik.transcoder.TranscoderOutput; 
import org.apache.batik.transcoder.image.PNGTranscoder; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     PNGTranscoder t = new PNGTranscoder(); 
     t.addTranscodingHint(PNGTranscoder.KEY_WIDTH, new Float(12600)); 
     t.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, new Float(12600)); 
     FileInputStream fis = new FileInputStream("C:\\StackOverflow\\SVG-logo.svg"); 
     TranscoderInput input = new TranscoderInput(fis); 
     OutputStream ostream = new FileOutputStream("C:\\StackOverflow\\res.png"); 
     TranscoderOutput output = new TranscoderOutput(ostream); 

     System.out.println("AllocatedMemory: \t" + (Runtime.getRuntime().totalMemory()/1024) + " Kb"); 
     t.transcode(input, output); 
     System.out.println("AllocatedMemory: \t" + (Runtime.getRuntime().totalMemory()/1024) + " Kb"); 

     ostream.flush(); 
     ostream.close(); 

    } 
} 

На моей машине выход:

AllocatedMemory: 4096 Kb 
AllocatedMemory: 1677721 Kb 

Так вот программа использует 1677 МБ перекодировать простой SVG-файл в файл с 12600 * 12600 PNG.

+0

Сколько у вас барабанов на вашем ПК в Великобритании? сколько времени требуется для запуска над кодом на вашем ПК? – Mihir

+0

OK Я попробовал его на другом ПК с более высоким баром, и он работает, теперь вы можете дать мне конфигурацию ПК, на которой этот код работает без проблем? вашу конфигурацию JDK и размер файла на диске сгенерированного (перекодированного) PNG в MB? – Mihir

+0

У меня 8 ГБ на моем ПК. Файл, который я кодирую в программе, находится в википедии: [link] http://en.wikipedia.org/wiki/File:SVG-logo.svg и занимает около 20 секунд. для обработки на моем ПК, давая выходной файл размером 1,1 МБ. Я запускал программу из Eclipse без специальных опций. –

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