3

jar次のコマンドを使用してコマンドラインから開始しました

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 MB のメモリが必要ですが、1100 MB はまだ空きがあります。

したがって、34 分後に上記のコードを実行すると、OutOfMemoryException がスローされます。

何が問題ですか ?プロセスの問題ですか、それともヒープの問題ですか?なぜ34分かかるの??

私のPC構成は次のとおりです

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)

この問題を解決するのを手伝ってください。

以下は、デバッグ メッセージを含む例外スタック tarce です。

上記のコードを実行する前に、VM引数を次のように変更しました

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

SVG リーダーから XML ドキュメントをビルドしています.... SVG リーダーから XML ドキュメントのビルドが完了しました.... 変更された XML ドキュメントを文字列ライターに変換しています.... 変更された XML ドキュメントから文字列ライターへの変換が完了しました.... claimBytes 766 Avaialbel Bytes 900189232 メモリ統計------------------------ 合計メモリはバイト: 912326656 合計メモリはメガバイト: 870 使用済みメモリはバイト: 9308384 使用済みメモリはメガバイト: 8 空きメモリはバイト: 900189096 空きメモリはメガバイト: 858


トランスコーディング開始:Sun Mar 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

1 に答える 1

2

未加工のエンコードされていない画像が約 600 MB しか満たされなくても、実装方法によっては、エンコーダーの内部表現にさらに多くのメモリが必要になる場合があります。次の例は、単純な 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 MB を使用して単純な SVG ファイルを 12600 * 12600 PNG ファイルにトランスコードします。

于 2013-03-24T22:51:52.570 に答える