1

코드에서 메모리 부족 (힙 공간) 오류가 발생하므로 프로파일 링을 통해 생성 오류가 있음을 알았습니다 의 이미지.Java - BufferedImage (ImageIO.Read) OutOfMemory 힙 공간

내가 가지고있는 것은 작은 이미지로 이미지를 생성하는 클래스이며 그 클래스가 그려집니다.

문제는 JPanels에 1000 개 이상의 이미지를로드하려는 경우 탭이 나오기 전에 약 750 개가 발생하며 실제로 자바 메모리를 확장하지 않으려한다는 것입니다.

을 Heres 코드 : 그러니까 기본적으로
class Foo extends JPanel{ 
private BufferedImage image; 
private Image scaled; 
public Foo(String link){ 
    try{ 
     setPreferredSize(new Dimension(50,50)); 
     image = ImageIO.read(new URL(link)); //Cause for memory leak 
     scaled= image.getScaledInstance(100, 140, BufferedImage.SCALE_FAST); 
     image.flush(); 
        //tried image = null; but did not help memory 
    } 
    catch(Exception e){} 
} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.drawImage(scaled, 5, 5, null); 
} 
} 

, 이미지에 링크를 읽을 수있는보다 효율적인 방법이, 또는 어떤 방법 불필요한 메모리를 제거? '당신은 아마 돈

...

drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) 
+0

한 번에 1000 개의 이미지를 표시하고 있습니까? – Jivings

+0

예 ... 많은 기억이 필요 하겠지만 아직도 메모리를 적게 읽어야합니다. – sl133

+0

필요할 때 여러 장의 이미지를 읽지 않고 불필요한 이미지를 놓으십시오. –

답변

0

이 충분히있을 것입니다 있는지 확실하지 않습니다,하지만 당신은 다음과 같은 방법을 사용하여 scaled의 사용을 제거 할 수 있습니다 매번 전체 이미지를 다시 읽어야합니다.

비슷한 기능을 구현했습니다. 내가 원하는 것은 모든 이미지의 스냅 샷을 원하는 크기로 저장하는 것입니다 + 파일 이름에이 스냅 샷의 타임 스탬프를 포함 시켜서 스냅 샷이 여전히 최신인지를 알 수 있습니다.

초기 스냅 샷 제작에 대한 문제는 해결되지 않지만 나중에 사용하기에 좋지 않습니다.

+0

imageObserver는 무엇이 될까요? – sl133

+0

위의 코드에서와 같이 'null'을 사용할 수 있습니다. –

+0

이번에는 힙 공간 오류가 발생하지 않았지만 이제는 GC 오버 헤드 한도를 초과했습니다. * 편집 * 그리고 그 직후에 힙 공간이 생겼다. – sl133

0

이 문제를 알고 :

관련 문제