2014-02-07 3 views
0

유일한 차이점은 두 개의 다른 자르기 위치입니다. 질문은 왜 내가이 오류가 있습니까 ??스레드 "스레드"의 예외 java.lang.OutOfMemoryError : 요청 된 배열 크기가 VM 제한을 초과합니다

메서드 호출

CropRealOriginalImage1 orderName = new CropRealOriginalImage1(); 
     FourAreaCropAgain1 orderNameFirst=new FourAreaCropAgain1(); 
     orderNameFirst.orderNameFirst(); 
     Decode decode= new Decode(); 
     decode.inputImage("C:/TEMP/Image/Embed Image/Four Area/OrderFirst.png"); 
     if(decode.s.equals("")){ 
      System.out.println("OderFirst=null"); 
     }else{ 
      //put b into txt file 
      System.out.println("decode.s" +decode.s); 
     } 

일 :

public void orderNameFirst(){ 
     ImageIcon icon = new ImageIcon("C:/TEMP/Image/Embed Image/Really Original.png"); 
    image = icon.getImage(); 
    image = createImage(new FilteredImageSource(image.getSource(), 
     new CropImageFilter(icon.getIconWidth()-290, 0, 10, 33))); 
      //new CropImageFilter(icon.getIconWidth()/2, icon.getIconHeight()/2, icon.getIconWidth()/2, icon.getIconHeight()/2))); 

    BufferedImage bufferedImage = new BufferedImage(icon.getIconWidth(), 
      icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics graphics = bufferedImage.getGraphics(); 
    graphics.drawImage(icon.getImage(), 0, 0, null); 

    Graphics2D g = bufferedImage.createGraphics(); 
    g.setColor(Color.WHITE); 
    g.fillRect(icon.getIconWidth()-290, 0, 10, 33); 

} 

public void orderNameFirst(){ 
     ImageIcon icon = new ImageIcon("C:/TEMP/Image/Embed Image/Really Original.png"); 
    image = icon.getImage(); 
    image = createImage(new FilteredImageSource(image.getSource(), 
     new CropImageFilter(3*icon.getIconWidth()/8, 0, icon.getIconWidth()/8, icon.getIconHeight()/2))); 
      //new CropImageFilter(icon.getIconWidth()/2, icon.getIconHeight()/2, icon.getIconWidth()/2, icon.getIconHeight()/2))); 

    BufferedImage bufferedImage = new BufferedImage(icon.getIconWidth(), 
      icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics graphics = bufferedImage.getGraphics(); 
    graphics.drawImage(icon.getImage(), 0, 0, null); 

    Graphics2D g = bufferedImage.createGraphics(); 
    g.setColor(Color.WHITE); 
    g.fillRect(3*icon.getIconWidth()/8, 0, icon.getIconWidth()/8, icon.getIconHeight()/2); 
    } 

오류 작동하지 : 디코드 integerLength은 : 2147483647 스레드 "스레드"java.lang.OutOfMemoryError와의 예외 : 이것은 당신이 원하는 대답하지 않을 수 있습니다, 그러나 이것은 당신이 무엇을 요구입니다 : 요청 된 배열의 크기는 VM 제한을

+0

질문을 잊어 버렸습니다. – Durandal

+0

요청한 배열 크기가 VM 한도를 초과합니다. –

+0

(실제로 질문하는 것 외에 예외 스택 추적을 질문에 복사하고 예외에 해당하는 코드의 줄을 식별해야합니다.) –

답변

2

포기를 초과합니다. 당신이 당신의 자바 VM의 힙 메모리의 최대 연속 블록보다 큰 배열을 만들려고하고 있기 때문에 ...

Exception in thread "Thread" java.lang.OutOfMemoryError: Requested array size exceeds VM limit 

:

The question is why i get this error??

당신은 오류가 발생합니다. 이것은 엄청나게 큰 이미지를 만들려고하거나 배열을 할당하려고 할 때 VM이 리소스가 부족한 상태 일 수 있기 때문에 발생할 수 있습니다.

이것은 대부분 BufferedImage 생성자 중 하나에서 발생합니다.

전체 스택 추적을 게시하지 않았거나 런타임에 프로그램에서 실제로 전달 된 이미지의 크기 나 다른 값에 대한 관련 정보를 게시하지 않았기 때문에 말하기는 어렵습니다.

해결 방법은 메모리 부족 원인에 따라 다릅니다.

예를 들어, 작성중인 Graphics/Graphics2D 인스턴스에서 결코 dispose을 호출하지 않는다는 것을 코드에서 확인할 수 있습니다. 이것은 아마도 시간이 지남에 따라 리소스 유출을 야기 할 수 있습니다 (단지 예를 들어, 다른 것이있을 수 있습니다).

메모리가 부족한 경우 이미지가 크기 때문에 최대 힙 크기를 늘려야합니다. 일반적으로 -Xmx<value> 인수를 java 명령 줄 (<value>이 새로운 최대 크기 인 256m, 1G 또는 그 유사)로 전달하여이 작업을 수행합니다.