>

경우에 따라 사용 가능한 모든 시스템 메모리 (3GB, 1.5GB 사용 가능)를 사용하는 BufferedImage에 이상한 문제가 있습니다.

간단한 래퍼를 만들었으며 다음과 같이 사용합니다 :

public ImageWrapper(final byte[] bytes) throws ImageWrapperException {
    this(new ByteArrayInputStream(bytes));
}

public ImageWrapper(final ByteArrayInputStream bis) throws ImageWrapperException {
    try {
        image = ImageIO.read(bis);
        bis.close();
    } catch (IOException e) {
        throw new ImageWrapperException(e);
    }
}

( image = ImageIO.read(file); 에서도 발생한다는 것을 jsut에서 확인했습니다. )

첫 번째 "메모리를 할당 할 수 없습니다"까지 예외가 발생하지 않습니다.

어떤 이유로 특정 유형의 이미지를 읽을 때 이미지를 읽으면 모든 시스템 메모리가 소모됩니다. 나는 힙이 아니라 실제로 시스템 메모리에 대해 이야기하고 있습니다.

일부 환경에서만 발생합니다.OSX에서는 발생하지 않지만데비안서버에서는 발생합니다

<올>
  • 이러한 이유가 무엇인지 아십니까?
  • 버퍼 드 이미지에 대한 대안이 있습니까? 더 잘 작동합니까?
  • 문제가있는 머신은 가상 서버입니다. 구성으로 인해 발생할 수 있습니까?
  • 감사합니다

    수정 :

    <올>
  • 예제 이미지 : http://cl.ly/1P430l0V1g133r0C291J
  • 이것은 처음이자 유일한 인스턴스입니다.
  • 방금 image = ImageIO.read(file); 에서도 발생한다는 것을 확인했습니다.  -자바 외부에 있어야한다고 생각하기 시작했습니다. 버그가있는 일부 기본 라이브러리 ...
  • EDIT2 :

    그래서 문제는 FileSystem에 있습니다. 여기서 수천 개의 이미지가 들어있는 7GB 디렉토리가 있습니다. 파일을 읽으려고 할 때 모든 메모리를 소비합니다. 파일 시스템 문제라고 생각합니다.


    • 답변 # 1

      ImageIO.read () 및 BufferedImage와 관련된 몇 가지 알려진 버그가 있습니다

      http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7166379

      http://bugs.sun.com/view_bug.do?bug_id=6716560

    • 답변 # 2

      BufferedImage에 문제가있는 것이 분명합니다. 두 서버에서 테스트 한 결과 동일한 결과-시스템 메모리가 완전히 부족합니다.

      결국 PHP에 간단한 래퍼를 작성했고 이제 이미지 조작에 GD를 사용합니다. 지금은 잘 작동합니다. 모든 제안에 감사드립니다!

    • 답변 # 3

      코드를 java.nio 로 옮기십시오.  그리고 memory mapped file  접속하다. 그것들은 힙 외부에 저장됩니다.

      이것은 흥미 롭습니다.

  • 이전 bash - jq를 사용하여 JSON 맵을 CSV로 변환
  • 다음 ios - 신속한 inputAccessoryView 재정의 버그