簡體   English   中英

執行javax.imageio.ImageIO.read(“ filename”)時發生java.lang.OutOfMemoryError

[英]java.lang.OutOfMemoryError when doing javax.imageio.ImageIO.read(“filename”)

我要壓縮大約4M或更多的“ JPG”圖像。這是我的代碼:

public static void Compress(String sourceFolder,String destFolder,double proportion) throws IOException
{
    File source=new File(sourceFolder);
    File[] sourceFiles=null;
    if(source.isDirectory())
    {
        sourceFiles=source.listFiles();
        for(int i=0;i<sourceFiles.length;i++)
        {
            String name="";
            javax.imageio.ImageIO.setUseCache(false);
            Image src = javax.imageio.ImageIO.read(sourceFiles[i]);
            name=sourceFiles[i].getName();
            int width=src.getWidth(null);
            int height=src.getHeight(null);
            destWidth=(int) (height*proportion);
            destHeight=(int) (width*proportion);
            BufferedImage tag=new BufferedImage(destWidth,destHeight,BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();  
            g.drawImage(src, 0, 0, destWidth, destHeight, null);
            src.flush();
            src=null;
            FileOutputStream out = new FileOutputStream(destFolder+"/"+name);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
            encoder.encode(tag);  
            out.close(); 
        }
    }
    else
        System.exit(0);
}

運行時

Image src = javax.imageio.ImageIO.read("filename");

發生異常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:58)
at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
at java.awt.image.Raster.createWritableRaster(Raster.java:938)
at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1056)
at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:943)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:915)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1282)
at functions.CompressImage.Compress(CompressImage.java:50)
at functions.CompressImage.main(CompressImage.java:24)

我嘗試了運行參數(-Xms = 1g),它仍然不起作用! 誰知道解決方案? 請幫助我,謝謝!

您需要獲取堆轉儲並對其進行分析。 所以最簡單的方法是添加JVM參數,例如

 -XX:+HeapDumpOnOutOfMemoryError 

這將自動創建堆轉儲/稍后您可以使用Java分析器(yourkit,jprofiler等)分析出了什么問題

4MB的JPG將產生巨大的BitMap文件。 我認為,它只需要大量的內存。 我經常在javax.imagio中閱讀有關大內存消耗的信息。

要獲取位圖大小,請計算image_X * image_Y *(8至10位* 3(顏色))

更新一些數學:

我假設每個顏色通道為8位:

7000 * 4900 * 8 * 3 = 1029000000位= 122MB

我相信,內存中必須有一個122MB的byte []。 如果操作系統(不是JVM)無法創建該內存塊,則會出現該異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM