2013-10-06 5 views
1

오늘은 간단한 Java 응용 프로그램을 만들었습니다. 일부 .png 파일을 메모리에로드해야합니다 (이 파일의 총 공간은 ~ 7MB). 그러나이 이상한 오류가 발생합니다.이상한 "java.lang.OutOfMemoryError : 자바 힙 공간"

(내 작은 명령 : 자바 -Xmx1024m -jar DIST/PNGImageLoader.jar) 여기

Loaded image (0) images/image_01000111100000011000000110100000 Loaded image (1) images/image_00000101010101101101000111111101 Loaded image (2) images/image_01001110110011110011111001000000 Loaded image (3) images/image_01001111000111010110101101001111 Loaded image (4) images/image_00011100000011100011001011011100 Loaded image (5) images/image_01010010001010001010110110110110 Loaded image (6) images/image_01101100010001000001000110101111 Loaded image (7) images/image_01010111011011101010101110100010 Loaded image (8) images/image_01101101110100001011001011101100 Loaded image (9) images/image_01100010111110011011100001000011 Loaded image (10) images/image_00011111011000111101101111101111 Loaded image (11) images/image_00000100111001010110101001110001 Loaded image (12) images/image_01000001100111011101101011011011 Loaded image (13) images/image_01100111000010000001011101111001 Loaded image (14) images/image_01101000011011000001111010001100 Loaded image (15) images/image_00010010110100001011000111111000 Loaded image (16) images/image_00111100111011101101101001000101 Loaded image (17) images/image_01111110001010111100011000000110 Loaded image (18) images/image_00010111101011100011101101101000 Loaded image (19) images/image_00101000001111110110000110101101 Loaded image (20) images/image_01110101110000010000000000001001 Loaded image (21) images/image_01001000101010101010000010100011 Loaded image (22) images/image_00110111100001110011010011011001 Loaded image (23) images/image_00001010001001000001101001001011 Loaded image (24) images/image_00101111000110011000110011111000 Loaded image (25) images/image_00101100010101000011001101010111 Loaded image (26) images/image_01101111101000010111011000011010 Loaded image (27) images/image_00111011111100000111100000000011 Loaded image (28) images/image_01100100000101111111001000111101 Loaded image (29) images/image_01001101110111111011000101000011 Loaded image (30) images/image_00110010111010000111111011100101 Loaded image (31) images/image_00111001110100011100101111111011 Loaded image (32) images/image_01100011101111010111110110001111 Loaded image (33) images/image_01000000110111000000010100010011 Loaded image (34) images/image_00110101000001001101100010101001 Loaded image (35) images/image_01001101011011010110100110111010 Loaded image (36) images/image_00010111010100110100011111110101 Loaded image (37) images/image_01011111011001111010000000111000 Loaded image (38) images/image_00110001100110011111000010110001 Loaded image (39) images/image_01110101010001111001011000000011 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.awt.image.DataBufferByte.(DataBufferByte.java:92) at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:415) at java.awt.image.Raster.createWritableRaster(Raster.java:941) at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1073) at javax.imageio.ImageReader.getDestination(ImageReader.java:2896) at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1280) at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1577) at javax.imageio.ImageIO.read(ImageIO.java:1448) at javax.imageio.ImageIO.read(ImageIO.java:1308) at pngimageloader.Images.loadImage(Images.java:22) at pngimageloader.Images.getImage(Images.java:33) at pngimageloader.Images.getAllImages(Images.java:43) at pngimageloader.PNGImageLoader.main(PNGImageLoader.java:15)

내 PNGImageLoader.java 클래스이며, 여기에

package pngimageloader; 

public class PNGImageLoader { 

    public static void main(String[] args) { 
     Images images = new Images(); 
     images.getAllImages("images/"); 
    } 
} 

는 Images.java 클래스입니다 ..

package pngimageloader; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.util.HashMap; 
import javax.imageio.ImageIO; 

public class Images { 

    HashMap images; 

    Images() { 
     images = new HashMap(); 
    } 

    BufferedImage loadImage(String path) { 
     try { 
      return ImageIO.read(new File(path)); 
     } catch (Exception exception) { 
      System.out.println(exception.getMessage()); 
      System.exit(1); 
      return null; 
     } 
    } 

    BufferedImage getImage(String path) { 
     BufferedImage image = (BufferedImage) images.get(path); 
     if (image == null) { 
      image = loadImage(path); 
      images.put(path, image); 
     } 
     return image; 
    } 

    void getAllImages(String path) { 
     File files = new File(path); 
     int i = 0; 
     for (File file : files.listFiles()) { 
      getImage(file.getPath()); 
      System.out.println("Loaded image (" + i + ") " + file.getPath()); 
      i++; 
     } 
    } 
} 

나는 프로답지 만, 나는 정말로 이상하다고 생각합니다. 사전 도움을 요청 해 주신 Patrick.

+4

어떻게 이상합니까? 디스크의 여러 이미지를 메모리에로드하고 있습니다. 메모리가 제한되어 있습니다. 따라서 OutOfMemoryError는 모든 이미지를로드 할 수있는 메모리가 부족하기 때문에 발생합니다. –

+0

@JBNizet 분명히 이상한 점은 이러한 이미지의 전체 크기는 단지 7MB이지만 [기본 최대 힙 크기는 상당히 큰 것입니다] (http://docs.oracle.com/javase/7/docs/technotes/guides/ VM/gc-ergonomics.html). 물론 기본값 이외의 다른 값을 사용하지 않는 한 ... – yair

+0

이 파일의 총 공간이 7MB와 비슷하기 때문에 나에게는 이상한 일이며 내 RAM 2GB는 무료입니다. 내 작은 명령 : java -Xmx128m -jar dist/PNGImageLoader.jar –

답변

0

GSP는 귀하의 작은 파일이 많은 메모리로 확장 될 수 있다고 지적했습니다. 대부분의 경우 이미지를 메모리에 보관해서는 안되며 거의 그렇게 할 이유가 없습니다. 당신이하고 싶은 일에 의존하는 일종의 스트리밍 물건을 사용하십시오.

관련 문제